Отфильтровать пустые столбцы из результатов GROUP BY CUBE - PullRequest
0 голосов
/ 01 февраля 2019

Я использую GROUP BY CUBE для вывода Всего мин. для каждого Инцидента # для каждого года.

SELECT
            IncidentNumber AS [Incident #]
          , SUM(Duration) AS [Total Min.]
          , YEAR(EntryDateTime) AS [Year]

     FROM TableX
     WHERE 
    GROUP BY CUBE
    (
        IncidentNumber
          , YEAR(EntryDateTime)
    )

Но я не хочустроки, где Год равен NULL, поскольку они являются избыточными для информации из строк, показывающих годы.

ВЫХОД

enter image description here

Итак, я установил это как подзапрос.

    SELECT * FROM
    (
            SELECT
                        IncidentNumber AS [Incident #]
                      , SUM(Duration) AS [Total Min.]
                      , YEAR(EntryDateTime) AS [Year]

                 FROM TableX
                 WHERE 
                GROUP BY CUBE
                (
                    IncidentNumber
                      , YEAR(EntryDateTime)
                )
    ) T
    WHERE T.Year IS NOT NULL;

Есть ли альтернатива, где я могу отфильтровать NULL, не делая этот подзапрос?

Если яиспользуйте GROUP BY ROLLUP Я все еще получаю NULL.enter image description here

1 Ответ

0 голосов
/ 01 февраля 2019

Вы можете добавить

HAVING GROUPING(YEAR(EntryDateTime))=0

Но самый эффективный способ - просто не рассчитать его вообще, если он вам не нужен.

вместо него можно использовать ROLLUP

GROUP BY ROLLUP (YEAR(EntryDateTime), IncidentNumber)

И если вам даже не нужна строка итоговой суммы, вы можете использовать GROUPING SETS

GROUP  BY GROUPING SETS ( (IncidentNumber, YEAR(EntryDateTime)), 
                           (YEAR(EntryDateTime)) 
                         ) 
...