2016-03-28 2 views
0

Итак, я намерен запрашивать данные для пары диаграмм в MySQL, Данные для диаграмм поступают из одной таблицы, но работают для нескольких временных диапазонов. Так что группа не работает.Несколько строк и столбцов с помощью счетных выражений

Сам Дата я хочу в формате

Total Oranges Mangoes Bananas Tomatoes 
---------------------------------------------- 
19  5  6   7  1 
24  3  7   2  12 
14  3  4   5  2 
20  5  7   6  2 

Теперь я могу получить Начальную строку, используя либо

SELECT 
sum(CASE WHEN Some_Criteria and (created between '2016-03-28' AND '2016-03-29')) THEN 1 ELSE 0 END) Total , 
sum(CASE WHEN Some_Other_Criteria and (created between '2016-03-28' AND '2016-03-29')) THEN 1 ELSE 0 END) Oranges 
... 
from SomeTable.Table1 
left join OtherTable ON SomeId = OtherId 

ИЛИ через

SELECT 
(SELECT count(distinct Field) FROM from SomeTable.Table1 left join OtherTable ON SomeId = OtherId WHERE SomeCriteria and (DateRange)) AS Total 
(SELECT count(distinct Field) FROM from SomeTable.Table1 left join OtherTable ON SomeId = OtherId WHERE SomeCriteria and (DateRange)) AS Oranges 
... 

Получение его в том же строка была бы простой, поскольку я просто использую вышеуказанный метод, но что, если я хочу, чтобы данные были в нескольких строках, но на основе разные диапазоны дат?

+3

Используйте первый запрос с 'группы by'. –

+0

, если 'created between ..' равно для каждого столбца, вы можете перейти к предложению' where' –

ответ

0

Вам нужны эти диапазоны дат в наборе результатов (либо подзапрос, временная таблица, либо какая-то постоянная таблица). После этого вы можете использовать свой первый запрос с JOIN в таблице диапазонов и затем использовать GROUP BY на этих диапазонах.

Например:

SELECT 
    DR.start_date, 
    DR.end_date, 
    SUM(CASE WHEN Some_Criteria AND (created BETWEEN DR.start_date AND DR.end_date)) THEN 1 ELSE 0 END) Total, 
    SUM(CASE WHEN Some_Other_Criteria AND (created BETWEEN DR.start_date AND DR.end_date)) THEN 1 ELSE 0 END) Oranges, 
... 
FROM 
    Date_Ranges DR 
INNER JOIN SomeTable.Table1 T1 ON 
    T1.created >= DR.start_date AND 
    T1.created < DR.end_date 
LEFT OUTER JOIN OtherTable OT ON OT.SomeId = T1.OtherId 
GROUP BY 
    DR.start_date, 
    DR.end_date 
Смежные вопросы