私はピボットテーブルを実現するストアドプロシージャを持っています。私の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]
を変更する必要があなたのケース文で
テーブルの外観はどうなっていますか? [ALL]列がありますか? –
@HynekBernard [すべて]は新しい列 – yuro