2013-02-26 2 views
1

У меня есть эта таблица, Lineas (id, date, proyect_id, hours), и я хочу выбрать сумму часов по дате в неделю. Например мне нужен этот вывод для дат между 01/01/2013 и 05/01/2013:выберите 5 дат недели

Proyect | 01/01/2013 | 02/01/2013 | 03/01/2013 | 04/01/2013 | 05/01/2013 
Proyect1 |  -  |  5  |  -  |  4  |  4 
Proyect2 |  4  |  2  |  8  |  4  |  2 
Proyect3 |  4  |  1  |  -  |  -  |  2 

И это данные внутри таблицы

Id | Proyect_id | date | hours 
    1 | Proyect1  | 02/01/2013 | 5 
    2 | Proyect1  | 04/01/2013 | 4 
    3 | Proyect1  | 05/01/2013 | 4 
    4 | Proyect2  | 01/01/2013 | 4 
    5 | Proyect2  | 02/01/2013 | 2 
    6 | Proyect2  | 03/01/2013 | 8 
    7 | Proyect2  | 04/01/2013 | 4 
    8 | Proyect2  | 05/01/2013 | 2 
    9 | Proyect3  | 01/01/2013 | 4 
    10 | Proyect3  | 02/01/2013 | 1 
    11 | Proyect3  | 05/01/2013 | 2 

Любая помощь или ключ?

Заранее спасибо

ответ

4

MySQL не имеет функции pivot, поэтому вам нужно будет реплицировать эту функцию, используя функцию aggregate с выражением CASE.

Если значения известны, то вы можете прописывать их, похожее на это:

select Proyect_id, 
    sum(case when date = '2013-01-01' then hours end) `2013-01-01`, 
    sum(case when date = '2013-02-01' then hours end) `2013-02-01`, 
    sum(case when date = '2013-03-01' then hours end) `2013-03-01`, 
    sum(case when date = '2013-04-01' then hours end) `2013-04-01` 
from Lineas 
group by Proyect_id 

Посмотреть SQL Fiddle with Demo

Но если значения неизвестны, то вы хотите использовать подготовленное заявление создания динамического SQL:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'sum(case when date = ''', 
     date, 
     ''' then hours else 0 end) AS `', 
     date, '`' 
    ) 
) INTO @sql 
FROM Lineas; 

SET @sql = CONCAT('SELECT Proyect_id, ', @sql, ' 
        FROM Lineas 
        GROUP BY Proyect_id'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

См SQL Fiddle with Demo

Оба результата:

| PROYECT_ID | 2013-01-01 | 2013-02-01 | 2013-03-01 | 2013-04-01 | 
------------------------------------------------------------------ 
| Proyect1 |   0 |   5 |   0 |   4 | 
| Proyect2 |   4 |   2 |   8 |   4 | 
| Proyect3 |   4 |   1 |   0 |   0 | 
2

Вы можете сделать это стержень в MySQL с помощью агрегации:

select proyect_id, 
     sum(case when date = '01/01/2013' then hours end) as "01/01/2013", 
     . . . 
from t 
group by proyect_id 

В . . . средства и так далее для остальных столбцов.

+0

yap! извините, но идея состоит в том, чтобы получить эти данные между двумя датами, например, между 11/01/2013 и 15/01/2013. Я должен построить этот результат, учитывая 2 даты, начальные и конечные данные. –

+0

В этом случае вам нужно построить инструкцию в виде строки, а затем выполнить ее. SQL-запрос имеет фиксированное количество столбцов. –