2016-07-27 4 views
1

私はピボットテーブルを実現するストアドプロシージャを持っています。私のSelectステートメントが変数@queryで定義されました。ここでストアドプロシージャクエリで新しい列を定義する方法

コードです:

BEGIN 
    SET NOCOUNT ON; 

    DECLARE @colNo nvarchar(max) 
    DECLARE @query nvarchar(max) 

    SET NOCOUNT ON; 

    WITH vals AS (
     SELECT DISTINCT t.No 
     FROM QR_Tests t 
    ) 

    SELECT @colNo = COALESCE(@colNo + ', ', '') + '['+ No +']' 
    FROM vals 
    ORDER BY No 

    SET @query = 'SELECT * 
        FROM (
        SELECT 
         CASE WHEN GROUPING(No) = 0 
          THEN CAST(No as CHAR(12)) 
         ELSE [ALL] 
         END As No, 
         CASE WHEN GROUPING(quote) = 0 
          THEN CAST(quote as CHAR(7)) 
         ELSE [ALL] 
         END As Quote 
        FROM QRTestView 
        WHERE datum >= @from_val and datum <= @to_val 
        GROUP BY No, Quote WITH CUBE) AS sel 
        PIVOT (
         COUNT(Quote) 
         FOR No IN ('+ @colNo +', [ALL]) 
        ) AS p' 

    EXEC sp_executesql @query, N'@from_val datetime, @to_val datetime', @from_val = @from, @to_val = @to 
END 

私は実質的に次のような結果が必要になります。

| Quote | DE10101 | DE10121 | DE22034 | ... | ALL 
| 100 | 2 | 0 | 3 | ... | 5 
| 99 | 0 | 4 | 3 | ... | 7 
| 98 | 5 | 1 | 7 | ... | 13 
| 90 | 0 | 0 | 1 | ... | 1 
| 50 | 12 | 10 | 4 | ... | 26 
| ALL | 19 | 15 | 18 | ... | 52 

私はこのblogから例を試してみました。ストアドプロシージャを実行すると、エラーメッセージが表示されます。

無効な列名 'ALL'。

結果にこの新しい列を定義するにはどうすればよいですか?


UPDATE: 変換を理解するために、ここでは、ソーステーブル:

| No  | Quote | Datum 
| DE10101 | 100 | 2016-01-01 
| DE10121 | 100 | 2016-01-02 
| DE10101 | 100 | 2016-01-05 
| DE22034 | 98 | 2016-01-05 
| DE10101 | 98 | 2016-01-10 
| DE10121 | 80 | 2016-01-10 
| DE22034 | 98 | 2016-01-10 
| DE22034 | 80 | 2016-01-11 
| DE10101 | 100 | 2016-01-20 
| DE10121 | 80 | 2016-01-21 

そして、これは結果でなければなりません:

| Quote | DE10101 | DE10121 | DE22034 | ALL 
| 100 | 3 | 1 | 0 | 4 
| 98 | 1 | 0 | 2 | 3 
| 80 | 0 | 2 | 1 | 3 
| ALL | 4 | 3 | 3 | 10 

現在、ストアドプロシージャはカウントされません。すべてNoの見積もり額あなたは、文字列値構築しているように2つの単一引用符を使用することを思い出して、'ALL'[ALL]を変更する必要があなたのケース文で

+0

テーブルの外観はどうなっていますか? [ALL]列がありますか? –

+0

@HynekBernard [すべて]は新しい列 – yuro

答えて

1

は、この行のすべての値の合計であります。したがって、あなたが指定したデータに基づいてSPコードを書き直す必要があります:

BEGIN 
    SET NOCOUNT ON; 

    DECLARE @colNo nvarchar(max) 
    DECLARE @colSum nvarchar(max) -- this will store [Column1]+[Column2] etc 
    DECLARE @query nvarchar(max) 

    SET NOCOUNT ON; 

    WITH vals AS (
     SELECT DISTINCT t.No 
     FROM QR_Tests t 
    ) 

    SELECT @colNo = COALESCE(@colNo + ', ', '') + QUOTENAME([No]), 
      @colSum = COALESCE(@colSum + '+ ', '') + QUOTENAME([No]) 
    FROM vals 
    ORDER BY [No] 
    -- add this column here 
    SET @query = 'SELECT * 
        FROM (
        SELECT *, '[email protected]+' as [ALL] 
        FROM (
         SELECT 
          CAST([No] as CHAR(12)) As No, 
          CAST(quote as CHAR(7)) As Quote, 
          CAST(quote as CHAR(7)) As Q 
         FROM QRTestView 
         WHERE datum >= @from_val and datum <= @to_val 
         ) AS sel 
        PIVOT (
         COUNT(Q) FOR No IN ('+ @colNo +') 
        ) AS p 
        UNION ALL 
        SELECT ''ALL'',*, '[email protected]+'[ALL] 
        FROM (
         SELECT 
          CAST([No] as CHAR(12)) As No, 
          COUNT(CAST(quote as CHAR(7))) As Quote, 
         FROM QRTestView 
         WHERE datum >= @from_val and datum <= @to_val 
         GROUP BY CAST([No] as CHAR(12)) 
         ) AS sel 
        PIVOT (
         MAX(Quote) FOR [No] IN ('+ @colNo +') 
        ) AS p 
       ) as d 
       ORDER BY CASE WHEN Quote = ''ALL'' THEN 0 ELSE CAST(Quote as int) END DESC' 

    EXEC sp_executesql @query, N'@from_val datetime, @to_val datetime', @from_val 
END 
+0

1秒あなたのソリューションを試してみましょう。はい、列 '[ALL]'は値の合計を表します:) – yuro

+0

プロシージャは 'Quote'列を選択しません。なぜアイデアはありますか? – yuro

+0

あなたはピボットで 'COUNT(Quote)'を使うからです。私はあなたのSPがちょうど1列を返すと思います。 – gofr1

1

:私はALL理解したよう

SET @query = 'SELECT * 
        FROM (
        SELECT 
         CASE WHEN GROUPING(No) = 0 
          THEN CAST(No as CHAR(12)) 
         ELSE ''ALL'' 
         END As No, 
         CASE WHEN GROUPING(quote) = 0 
          THEN CAST(quote as CHAR(7)) 
         ELSE ''ALL'' 
         END As Quote 
        FROM QRTestView 
        WHERE datum >= @from_val and datum <= @to_val 
        GROUP BY No, Quote WITH CUBE) AS sel 
        PIVOT (
         COUNT(Quote) 
         FOR No IN ('+ @colNo +', [ALL]) 
        ) AS p' 
+0

あなたの答えに感謝する必要があります。 SProcが結果に列の「Quote」を表示しない理由はありますか? – yuro

関連する問題