【问题标题】:SQL totals dynamic pivotSQL 总计动态数据透视
【发布时间】:2019-03-31 15:50:41
【问题描述】:

我有一个动态枢轴,每列底部有一个总计,但是我试图在每行的末尾添加一个总计。

我的 SQL 在下面

SELECT @Cols = STUFF((SELECT  ',' +QUOTENAME(PRD_ValidDate)
            FROM #Table
            GROUP BY PRD_ValidDate
            ORDER BY PRD_ValidDate
        FOR XML PATH (''), Type).value('.','NVARCHAR(MAX)'),1,1,'')

SELECT @ColsWithNoNulls = STUFF((SELECT  distinct ',ISNULL(' + QUOTENAME(PRD_ValidDate) + ', 0) ' + QUOTENAME(PRD_ValidDate)
            FROM #Table
            GROUP BY PRD_ValidDate
        FOR XML PATH (''), Type).value('.','NVARCHAR(MAX)'),1,1,'')

SET @Query = 
'
SELECT cardtype as [Card Type],' + @ColsWithNoNulls + '  FROM
(
SELECT ISNULL(CAST(Cardtype AS VARCHAR(30)),''TOTAL'') CardType, ISNULL(SUM    (AllEntries),0) as AllEntries, PRD_ValidDate FROM #Table
GROUP BY cardtype,  prd_Validdate
WITH CUBE
 ) src
PIVOT
( SUM(AllEntries)
 For PRD_ValidDate IN ('+@Cols+')) piv
 ORDER BY CASE WHEN (CardType=''TOTAL'')THEN 1 ELSE 0 END, CardType'

提前致谢!

【问题讨论】:

    标签: sql dynamic pivot


    【解决方案1】:

    我认为最好的解决方案是创建一个在查询结束时进行求和的 UNION。我在下面给了你一个例子。我不确定我是否在不了解您的表格的情况下为您提供了所有正确的语法。另外,日期不能合计,所以我假设您想要天数,所以我使用了一个函数来合计天数。

            SELECT cardtype as [Card Type],' + @ColsWithNoNulls + '  FROM
            (SELECT ISNULL(CAST(Cardtype AS VARCHAR(30)),''TOTAL'') CardType, 
             ISNULL(SUM    (AllEntries),0) as AllEntries, PRD_ValidDate FROM #Table
            GROUP BY cardtype,  prd_Validdate
            WITH CUBE) src
            PIVOT
            ( SUM(AllEntries)
             For PRD_ValidDate IN ('+@Cols+')) piv
             UNION 
             select sum((SELECT ISNULL(CAST(Cardtype AS VARCHAR(30)),''TOTAL'')), 
     sum(ISNULL(SUM (AllEntries),0)) as AllEntries, days(PRD_ValidDate) FROM 
        SELECT cardtype as [Card Type],' + @ColsWithNoNulls + '  FROM
        (SELECT ISNULL(CAST(Cardtype AS VARCHAR(30)),''TOTAL'') CardType, 
         ISNULL(SUM    (AllEntries),0) as AllEntries, PRD_ValidDate FROM #Table
        GROUP BY cardtype,  prd_Validdate
        WITH CUBE) src
        PIVOT
        ( SUM(AllEntries)
         For PRD_ValidDate IN ('+@Cols+')) piv
    

    【讨论】:

    • 谢谢Karlomanio,枢轴正在计算“AllEntries”,按日期(沿顶部)和左侧的卡片类型拆分),所以总数将是卡片类型的 Allentries 的总和,因为我已经按日期计算所有条目的总和。我添加了您附加的代码,但是在关键字“as”附近出现以下语法错误。关键字“with”附近的语法不正确。如果这个语句是一个公用表表达式、一个 xmlnamespaces 子句或一个更改跟踪上下文子句,则前面的语句必须以分号结束。
    • 如果您可以将答案标记为正确。我稍微改变了说法。不知何故,SQL 语句搞砸了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2014-10-16
    相关资源
    最近更新 更多