如何在SQL DW中使用汇总分组功能错误?

时间:2019-03-23 01:28:09

标签: sql azure azure-sql-data-warehouse

我收到错误消息:ROLLUP不是函数名,但是文档说它应该可以工作  消息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的这段代码有关的问题,我将不胜感激!

2 个答案:

答案 0 :(得分:0)

根据this github文档,不支持 ROLLUP

  

GROUP BY T-SQL子句将数据聚合到一组摘要行。   GROUP BY具有SQL Data Warehouse不支持的某些选项。   这些选项都有解决方法。

     

这些选项是

     

通过ROLLUP进行分组

     

组合组

     

GROUP BY CUBE

建议的解决方法是使用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

答案 1 :(得分:0)

我正在使用Azure Synapse Analytics(是SQL数据仓库),并且ROLLUP选项有效。下一页显示了Azure Synapse Analytics中“ GROUP BY”子句的单独定义,其中支持ROLLUP但不支持CUBE和GROUPING SETS

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

我认为这会随着产品的成熟而改变。