피벗 테이블을 실현하는 저장 프로 시저가 있습니다. 내 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
이 블로그 에서 예제를 시도했습니다 . 저장 프로 시저를 실행하면 오류 메시지가 나타납니다.
잘못된 열 이름 'ALL'.
내 결과에 대해이 새 열을 어떻게 정의 할 수 있습니까?
업데이트 : 변환을 이해하기 위해 여기에 소스 테이블이 있습니다.
| 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
.
내가 이해 ALL
하는대로이 행의 모든 값의 합계입니다. 따라서 제공 한 데이터를 기반으로 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 *, '+@colSum+' 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'',*, '+@colSum+'[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
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다