2016-10-11 21 views
1

我有這個存儲過程:行和列的總動態支點在MS SQL Server 2008中,我的問題是行總計和列總計)的所有產品時添加

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 

,給了我這樣的輸出:

image

最後一行與TOTAL是我需要添加的。我怎樣才能做到這一點?

+2

你的問題是什麼? – Kushan

+2

關鍵字:'Group by ROLLUP' –

+1

還有'GROUP BY GROUPING SETS'。 – Wanderer

回答

1

把你查詢的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, '[email protected] + ' 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

要添加總計列使用:

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, '[email protected] + ', 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)'; 
+0

好的,但我需要1000個產品的示例行總數和列總數 –

+0

這裏是畝產 –

+0

請把你的查詢到你的問題,請。 – gofr1

0

i like to make this picture

這是m y生產商

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, '[email protected] + ' 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) 
+0

vb.net 2010中datagridview的行總數和列總數 –