[英]Row and column total in dynamic pivot in MS SQL Server 2008 my questions is row total and columns total) for all products when add
我有這個存儲過程:
USE [Baxe]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[CreateTable]
AS
BEGIN
DECLARE @cols AS nvarchar( max) ,
@query AS nvarchar( max);
SET @cols = STUFF(( SELECT DISTINCT ',' + QUOTENAME( bmarke)
FROM subbuyer FOR XML PATH( '' ) , TYPE ).value( '.' , 'NVARCHAR(MAX)') , 1 , 1 , '');
SET @query = 'SELECT bdate, ' + @cols + ' from ( select bdate, bprice as q , bmarke from subbuyer ) x
pivot ( SUM(q)for bmarke in (' + @cols + ') ) p ';
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(CHAR(10), bmarke, 120))
from subbuyer
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
PRINT @query;
PRINT @cols;
EXECUTE ( @query );
end
這給了我這個輸出:
TOTAL 的最后一行是我需要添加的。 我怎樣才能做到這一點?
將您的查詢放在 CTE 或臨時表中並使用GROUP BY ROLLUP :
;WITH cte AS (
--your query here
)
SELECT ISNULL(bdate,'TOTAL') bdate,
SUM(Total) Total,
SUM(ACCESSORIES) ACCESSORIES,
SUM(NBB) NBB,
SUM(UNDERWARE) UNDERWARE
FROM cte
GROUP BY ROLLUP (bdate)
輸出:
bdate Total ACCESSORIES NBB UNDERWARE
13/04/2016 7000 7000 NULL NULL
14/04/2016 3000 NULL NULL 3000
15/04/2016 3000 NULL NULL 3000
16/04/2016 3000 NULL 3000 NULL
17/04/2016 23000 14000 6000 3000
TOTAL 39000 21000 9000 9000
編輯#1
根據您提供的樣本。 您需要使用 SUM 函數添加帶有列名的變量:
DECLARE @sumcols nvarchar(max)
SET @sumcols = STUFF(( SELECT DISTINCT ', SUM(' + QUOTENAME( bmarke)+') as ' + QUOTENAME(bmarke)
FROM subbuyer FOR XML PATH( '' ) , TYPE ).value( '.' , 'NVARCHAR(MAX)') , 1 , 1 , '');
並更改您的動態查詢,因此您之前的查詢將在子查詢中:
--Forgot about two quotes around TOTAL
SET @query = 'SELECT ISNULL(bdate,''TOTAL'') bdate, '+@sumcols + ' FROM (
SELECT bdate, ' + @cols + ' from ( select bdate, bprice as q , bmarke from subbuyer ) x
pivot ( SUM(q)for bmarke in (' + @cols + ') ) p
) t GROUP BY ROLLUP (bdate)';
希望這可以幫助。
編輯#2
要添加 TOTAL 列,請使用:
DECLARE @pluscols nvarchar(max)
SET @pluscols = STUFF(( SELECT DISTINCT '+' + QUOTENAME( bmarke)
FROM subbuyer FOR XML PATH( '' ) , TYPE ).value( '.' , 'NVARCHAR(MAX)') , 1 , 1 , '') + ' as [TOTAL]';
並更改您的動態查詢,因此您之前的查詢將在子查詢中:
--Forgot about two quotes around TOTAL
SET @query = 'SELECT ISNULL(bdate,''TOTAL'') bdate, '+@sumcols + ', SUM([TOTAL]) as [TOTAL] FROM (
SELECT bdate, ' + @cols + ', ' + @pluscols + ' from ( select bdate, bprice as q , bmarke from subbuyer ) x
pivot ( SUM(q)for bmarke in (' + @cols + ') ) p
) t GROUP BY ROLLUP (bdate)';
這是我的制作人
use baxe
DECLARE @cols AS nvarchar( max) ,
@query AS nvarchar( max);
SET @cols = STUFF(( SELECT DISTINCT ',' + QUOTENAME( bmarke)
FROM subbuyer FOR XML PATH( '' ) , TYPE ).value( '.' , 'NVARCHAR(MAX)') , 1 , 1 , '');
SET @query = 'SELECT ISNULL(bdate,''TOTAL'') bdate, '+@cols + ' FROM (SELECT bdate, ' + @cols + ' from ( select bdate, bprice as q , bmarke from subbuyer ) x
pivot ( SUM(q)for bmarke in (' + @cols + ') ) p;
) GROUP BY ROLLUP (bdate)';
PRINT (@query )
PRINT (@cols)
EXEC (@query)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.