Как использовать функцию объединения функций группировки в SQL DW? - PullRequest
1 голос
/ 23 марта 2019

Я получаю сообщение об ошибке, что ROLLUP не является именем функции, но в документации сказано, что оно должно работать Msg 104162, Уровень 16, Состояние 1, Строка 2 «ROLLUP» не является распознанным именем встроенной функции.

Я пробовал группировать наборы, но он сказал мне, что синтаксис был неправильным, вот тогда я увидел, что наборы групп не работают с DW

SELECT S.[ProjectID]
      ,P.ProjectId
      ,P.Level2
      ,S.[PTDIncurredAmount]
      ,S.[PriorYearIncurredAmount]
      ,S.[YTDIncurredAmount], sum([YTDIncurredAmount]) as CTDActuals
  FROM [Fact].[vProjectSummary] as S
  JOIN dim.vProject as P on S.ProjectID=P.ProjectId
  Group by ROLLUP (P.Level2, S.ProjectID )

Если кто-то может указать мне более конкретнопроблема с этим кодом для Azure SQL DW. Я был бы очень признателен за это!

1 Ответ

0 голосов
/ 23 марта 2019

Согласно этой документации github ROLLUP не поддерживается:

Предложение GROUP BY T-SQL объединяет данные в сводный набор строк. В GROUP BY есть несколько параметров, которые хранилище данных SQL не поддерживает. Эти параметры имеют обходные пути.

Эти опции

GROUP BY с ROLLUP

ГРУППОВЫЕ КОМПЛЕКТЫ

GROUP BY с кубом

Предложенный обходной путь - использовать UNION ALL для имитации ROLLUP. Если я возьму упрощенную версию вашего запроса

SELECT S.projectID, p.Level2, SUM( [YTDIncurredAmount] )
FROM [Fact].[vProjectSummary] AS S
    INNER JOIN dim.vProject AS P ON S.ProjectID = P.ProjectId
GROUP BY ROLLUP ( P.Level2, S.ProjectID )
ORDER BY 1, 2, 3

При использовании ROLLUP этот запрос запрашивает следующие агрегаты:

  • Level2 и ProjectId
  • Level2
  • Итого

Вы можете смоделировать это с помощью UNION ALL:

-- Level 2 and ProjectID
SELECT S.ProjectID, p.Level2, SUM( [YTDIncurredAmount] )
FROM [Fact].[vProjectSummary] AS S
    INNER JOIN dim.vProject AS P ON S.ProjectID = P.ProjectID
GROUP BY S.ProjectID, p.Level2

UNION ALL

-- Level 2 
SELECT NULL, p.Level2, SUM( [YTDIncurredAmount] )
FROM [Fact].[vProjectSummary] AS S
    INNER JOIN dim.vProject AS P ON S.ProjectID = P.ProjectID
GROUP BY p.Level2

UNION ALL

-- Grand total
SELECT NULL, NULL, SUM( [YTDIncurredAmount] )
FROM [Fact].[vProjectSummary] AS S
    INNER JOIN dim.vProject AS P ON S.ProjectID = P.ProjectID

Я не смог заставить работать какие-либо запросы, используя ROLLUP, хотя эта ссылка, кажется, предполагает, что это возможно:

https://docs.microsoft.com/en-us/sql/t-sql/queries/select-group-by-transact-sql?view=sql-server-2017

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

https://feedback.azure.com/forums/307516-sql-data-warehouse/suggestions/35836048-grouping-and-group-by-rollup-functions-needs-to-be

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...