2012-02-14 2 views
0

У меня стол на MSSQL-сервер с несколькими полями:MSSQL граф даты, которые в прошлом во время GROUP BY

fieldA,fieldB,fieldC,DateTimeField 

теперь я делаю выбор, как это:

SELECT fieldA,fieldB,fieldC, max(DateTimeField),min(DateTimeField), 
(count(*) - count(DateTimeField)) as DateTimeFieldIsNull 
FROM table 
GROUP BY fieldA, fieldB, fieldC 

который работает достаточно хорошо.

Теперь я хочу считать все DateTimeField s, которые были в прошлом или в другом столбце, которые в будущем.

Есть ли способ перфоманса? (может быть, даже без СОЗДАНИЯ)?

Thnx Гарри

+0

Что вы имеете в виду 'DateTimeFields, которые находятся в past'? –

ответ

5

Просто добавьте COUNT/СЛУЧАЙ конструкцию.
Вы получаете NULL из подразумеваемой ELSE который COUNT игнорирующей

COUNT(CASE WHEN DateTimeField > GETDATE() THEN 1 END) AS FutureDates, 
COUNT(CASE WHEN DateTimeField < GETDATE() THEN 1 END) AS PastDates, 
+2

+1 Гораздо лучше, чем мой ответ! – Curt

+0

это удивительно. – Harry

1

Вы можете использовать 2 подзапросов, чтобы получить этот набор результатов:

SELECT fieldA,fieldB,fieldC, max(DateTimeField),min(DateTimeField), 
(count(*) - count(DateTimeField)) as DateTimeFieldIsNull 
,(SELECT COUNT(DateTimeField) 
    FROM table 
    WHERE DateTimeField<GETDATE() 
    AND t.fieldA=fieldA 
    AND t.fieldB=fieldB 
    AND t.fieldC=fieldC) as PastDates 
,(SELECT COUNT(DateTimeField) 
    FROM table 
    WHERE DateTimeField>=GETDATE() 
    AND t.fieldA=fieldA 
    AND t.fieldB=fieldB 
    AND t.fieldC=fieldC) as FutureDates 
FROM table t 
GROUP BY fieldA, fieldB, fieldC 
1

Нечто подобное ?:

SELECT fieldA, fieldB, fieldC, 
     MAX(DateTimeField), MIN(DateTimeField), 
     (COUNT(*) - COUNT(DateTimeField)) as DateTimeFieldIsNull, 
     SUM(CASE WHEN DateTimeField < GETDATE() THEN 1 END) DateTimeFieldInThePast, 
     SUM(CASE WHEN DateTimeField > GETDATE() THEN 1 END) DateTimeFieldInTheFuture 
FROM table 
GROUP BY fieldA, fieldB, fieldC 
2
SELECT fieldA,fieldB,fieldC, max(DateTimeField),min(DateTimeField), 
(count(*) - count(DateTimeField)) as DateTimeFieldIsNull 
, COUNT(CASE WHEN DateTimeField > GETDATE() THEN 1 END) AS 'ABC' 
, COUNT(CASE WHEN DateTimeField < GETDATE() THEN 1 END) AS 'XYZ' 
FROM table 
GROUP BY fieldA, fieldB, fieldC; 
+0

opps ... кто-то уже разместил там похожее решение :) – Scorpion

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