MSSQL Подсчет дат, которые были в прошлом во время GROUP BY - PullRequest
0 голосов
/ 14 февраля 2012

У меня есть таблица на MSSQL-сервере с парой полей:

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, которые находятся в прошлом или в другом столбце, которые находятся в будущем.

Есть ли перфомантный способ? (может быть, даже без присоединения)?

Спасибо, Гарри

Ответы [ 4 ]

5 голосов
/ 14 февраля 2012

Просто добавьте конструкцию COUNT / CASE.
Вы получаете NULL от подразумеваемого ELSE, который COUNT игнорирует

COUNT(CASE WHEN DateTimeField > GETDATE() THEN 1 END) AS FutureDates,
COUNT(CASE WHEN DateTimeField < GETDATE() THEN 1 END) AS PastDates,
2 голосов
/ 14 февраля 2012
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;
1 голос
/ 14 февраля 2012

Как то так?:

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
1 голос
/ 14 февраля 2012

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...