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