2016-10-11 8 views
1

を追加するとき、私は、このストアドプロシージャがあります。行と列の合計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

キーワード: '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 

EDIT#1

あなたが提供されたサンプルに基づいています。

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 , ''); 

そして、あなたの前のクエリは、サブクエリになりますので、あなたの動的なクエリを変更します:あなたは、SUM関数で列名を持つ変数を追加する必要が

--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)'; 

・ホープ、このことができます。

EDIT#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, '[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

OKですが、1000行の製品の合計の列と合計の列が必要です –

+0

ここにmuの生産があります –

+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の行の合計と列の合計 –