Sql server 如何使用每行的总计列透视查询结果

Sql server 如何使用每行的总计列透视查询结果,sql-server,tsql,pivot,pivot-table,Sql Server,Tsql,Pivot,Pivot Table,我有上面的查询,它将pivot与动态列一起用作存储过程的一部分。到目前为止,查询工作正常,但我正在努力为每个返回的行添加一个grant total列,该列将是动态生成的列的总和(在变量@TimeByDay中) 我想在这里读一篇文章,但有些方法,我似乎无法让它正常工作。一般来说:总的来说,在大多数情况下表示层应该计算的东西 如果必须这样做,您有两个选择: 让您的SP按原样返回SELECT,然后再放置一行SELECT,该行只返回一行,其中包含您需要的所有总和。根据要调用的工具,可以通过一次对SP的调

我有上面的查询,它将pivot与动态列一起用作存储过程的一部分。到目前为止,查询工作正常,但我正在努力为每个返回的行添加一个grant total列,该列将是动态生成的列的总和(在变量
@TimeByDay
中)

我想在这里读一篇文章,但有些方法,我似乎无法让它正常工作。

一般来说:总的来说,在大多数情况下表示层应该计算的东西

如果必须这样做,您有两个选择:

  • 让您的SP按原样返回
    SELECT
    ,然后再放置一行
    SELECT
    ,该行只返回一行,其中包含您需要的所有总和。根据要调用的工具,可以通过一次对SP的调用读取多个结果集

  • 用这样的东西

  • 代码使用
    UNION ALL
    添加您的总计。需要进行RowInx和排序,以确保正确的顺序和最后一位的总计

    DECLARE @TimeByDay VARCHAR(max)
    
    SET @TimeByDay = LTRIM(RTRIM(
      (
        SELECT QUOTENAME(REPLACE(LEFT(DATENAME(dw, TimeByDay), 3) + ', ' + CAST(TimeByDay AS varchar(11)),'''',''''''),'[') + ', '           
        FROM #TimesheetLineData
        GROUP BY TimeByDay
        ORDER BY TimeByDay
        FOR XML PATH('')
      )))
      SET @TimeByDay = LEFT(@TimeByDay, Len(@TimeByDay) - 1)
      --PRINT 'columns -' + @TimeByDay;
    
    DECLARE @sql VARCHAR(MAX), @sql2 VARCHAR(MAX), @sql3 VARCHAR(MAX), @sql4 VARCHAR(MAX),@sql5 Varchar(Max),@sql6 Varchar(Max),@sql7 Varchar(Max),@sql8 Varchar(Max);
    
    SET @sql = 'SELECT *,0 As OrderID 
            INTO ##fp_FetchTimeSheet_PWA_Data 
            FROM 
            ('
    
    SET @sql3 = ' 
            SELECT ResourceName AS ResourceName
                , SOW
                , TaskName As [Task Name/Description]
                , ' + @TimeByDay + '
    
        FROM
        (
            SELECT 
            ResourceName,
            SOW,    
            TaskName,
            LEFT(DATENAME(dw, TimeByDay), 3) + '', '' + CAST(TimeByDay AS varchar(11)) AS TimeByDay,
            CAST(CAST(ActualWorkBillable as decimal(8,1)) as Varchar)+ '' h''  AS PlannedWork
            FROM #TimesheetLineData'
    
    SET @sql3=@sql3 + ') AS SourceTable
        PIVOT
        (
            MAX(PlannedWork)'
    SET @sql4 = ' FOR TimeByDay IN ('+ @TimeByDay +')
        ) AS PivotTable
        ) A 
        ORDER BY ResourceName, [Task Name/Description],SOW';
    
    EXEC  (@sql + @sql3 + @sql4)
    
    SET @sql5 = 'INSERT INTO ##fp_FetchTimeSheet_PWA_Data 
        SELECT *,1 As OrderID FROM
            ('
    
    SET @sql7 = ' 
            SELECT ResourceName
                , NULL As SOW               
                , ''Total Actual Work'' As [Task Name/Description]
                , ' + @TimeByDay + '
        FROM
        (
            SELECT 
                ResourceName, 
                SOW,
                [Task Name/Description],
                LEFT(DATENAME(dw, TimeByDay), 3) + '', '' + CAST(TimeByDay AS varchar(11)) AS TimeByDay,
                TotalActualWork
            from #TimesheetLineDataSummary'
    
    set @sql7=@sql7 + ') AS SourceTable
        PIVOT
        (
            MAX(TotalActualWork)'
    
    SET @sql8 = ' FOR TimeByDay IN ('+ @TimeByDay +')
        ) AS PivotTable
        )A
        ORDER BY ResourceName, [Task Name/Description]';
    
    exec  (@sql5 + @sql7 + @sql8)
    
    SELECT *
    FROM ##fp_FetchTimeSheet_PWA_Data
    ORDER BY ResourceName,OrderID
    

    这将列总数作为最后一行,但我需要的是行总数作为最后一列。啊,我不明白这一点。。。既然您是动态地这样做的,为什么不动态地添加一个
    ,col1+col2+col3作为RowTotal
    ?我将此标记为答案,因为您上面的评论使我重新思考了我试图解决问题的方式,这使我发布了此问题,并且在那里我有一个解决方案。您使用的是什么版本的SQL Server?以下是一个关于获得总行的示例-您是否正在使用?@BlueFoots SQL Server 2012
    DECLARE @tbl TABLE (ID INT IDENTITY,val1 INT, val2 INT);
    INSERT INTO @tbl VALUES (1,2),(3,4),(5,6);
    
    SELECT ID,val1,val2
    FROM
    (
        SELECT ROW_NUMBER() OVER(ORDER BY ID) AS RowInx, * FROM @tbl
        UNION ALL
        SELECT 1000000,NULL,SUM(val1),SUM(val2) FROM @tbl
    ) AS t
    ORDER BY t.RowInx