2014-10-27 5 views
1

У меня есть таблица вроде этого:MySQL выберите строки на основе результата между двумя колоннами даты

id | Type | Date  | DocDate 
------------------------------ 
1 | A | 2014-04-05 | 2014-04-05 
2 | A | 2014-05-06 | 2014-05-08 
3 | B | 2014-06-06 | 2014-06-06 

Мне нужно создать столбчатый полукокс. Но для этого мне нужно, чтобы превратить мой стол в:

Type | Green | Red 
----------------------- 
A | 1  | 1 
B | 1  | 0 

Где зеленый и красный являются результатом следующих условий:

IF (DocDate - Date) <= 1 THEN Green 
IF (DocDate - Date) > 1 THEN Red 

Я попробовал этот запрос:

SELECT CASE 
    WHEN (DocDate - Date) <= 1 THEN 'Green' 
    WHEN (DocDate - Date) > 1 THEN 'Red' 
END AS X, Count(OccurrenceID) AS Total 
FROM tbloccurrence 
GROUP BY CASE 
    WHEN (DocDate - Date) <= 1 THEN 'Green' 
    WHEN (DocDate - Date) > 1 THEN 'Red' 
END; 

Но результат не тот, который мне нужен. Кто-нибудь может мне помочь?

ответ

1

Я начал с написания запроса, который вытащил каждую строку из вашей таблицы и назначил зеленые или красные столбцы. Для этого вы можете использовать оператор IF(). Это принимает 3 параметра: условие, что делать, если это условие истинно и что делать, если это условие ложно. Это дает нам следующее:

SELECT type, IF(DATEDIFF(docdate, dateCol) <= 1, 1, 0) AS green, IF(DATEDIFF(docdate, dateCol) > 1, 1, 0) AS red 
FROM myTable; 

Я также использовал функцию DATEDIFF(). Это возвращает целое число дней между двумя параметрами (для них требуются параметры DATE или DATETIME).

Тогда я просто подвел красные и зеленые столбцы и сгруппированы по типу, чтобы соответствовать вашему результирующего набора:

SELECT type, SUM(IF(DATEDIFF(docdate, dateCol) <= 1, 1, 0)) AS green, SUM(IF(DATEDIFF(docdate, dateCol) > 1, 1, 0)) AS red 
FROM myTable 
GROUP BY type; 

Вот ваш бесплатный SQL Fiddle.

+1

Это именно то, что мне нужно! Большое спасибо! – user3163404

Смежные вопросы