SQL-сервер получает точное количество с помощью «Группировать по… с кубом»

В основном я пытаюсь получить отчетливое количество в пределах этого кубического результата. Но, к сожалению, вы не можете использовать Count (отличное (Поле)) с кубом и сверткой ( как указано здесь )

Вот как выглядят данные. (Это просто простой пример, я действительно ожидаю дубликатов в данных)

    Category1       Category2       ItemId
    a               b               1
    a               b               1
    a               a               1
    a               a               2
    a               c               1
    a               b               2
    a               b               3
    a               c               2
    a               a               1
    a               a               3
    a               c               4

Вот что я хотел бы сделать, но это не работает.

SELECT
  Category1,
  Category2,
  Count(Distinct(ItemId))
FROM ItemList IL
GROUP BY
  Category1,
  Category2
WITH CUBE

Я знаю, что я могу выполнить подвыбор, подобный этому, чтобы получить желаемые результаты:

SELECT
  *,
  (SELECT
     Count(Distinct(ItemId)) 
   FROM ItemList IL2 
   WHERE 
     (Q1.Category1 IS NULL OR Q1.Category1 IS NOT NULL AND Q1.Category1 = IL2.Category1) 
     AND
     (Q1.Category2 IS NULL OR Q1.Category2 IS NOT NULL AND Q1.Category2 = IL2.Category2))
       AS DistinctCountOfItems 
FROM (SELECT
        Category1,
        Category2
      FROM ItemList IL
      GROUP BY
        Category1,
        Category2
      WITH CUBE) Q1

Но это работает медленно, когда набор результатов велик из-за подвыбора. Есть ли какой-либо другой способ получить отчетливое число из результата в кубе?

Это результат, который я хочу видеть

Category1     Category2    DistinctCountOfItems
a             a            3
a             b            3
a             c            3
a             NULL         4
NULL          NULL         4
NULL          a            3
NULL          b            3
NULL          c            3

5
задан John Hartsock 3 November 2010 в 20:02
поделиться