2013-10-21 4 views
0

다음 데이터가 있습니다. 결과가 요구되는 이와 같은 헤더 paymonth 열에SQL Server에서 여러 열의 피벗

state f_name  product  paymonth  income  expense  savings 
state_1 f1   product_1 apr-2013  5000  1500  3500 
state_1 f1   procudt_1 may-2013  4500  3000  1500 
state_1 f1   procudt_2 may-2013  4500  3000  1500 
state_2 f2   product_2 apr-2013  15000  11500  35000 
state_2 f2   product_3 aug-2013  1500  500   1000 

피벗 ...

state f_name product apr-2013_income apr-2013_expense apr-2013_savings may-2013_income may-2013_expense.....and so on for distinct paymonth 
state_1 f1  product_1 5000    1500    3500    4500    3000....and so on.... 
state_1 f1  product_2 0     0     0     4500    3000.... 

이제 진짜 문제는 상태, f_name이며, 제품은 열으로 남아 있어야하고 동적이다.

또한 paymonth 및 기타 데이터는 동적입니다.

피벗을 사용해야합니다. 나는 몇 가지 예를 봤지만 내가 원하는 것을 얻지 못했습니다.

이 내가 뭘하려 ...

DECLARE @COLS AS NVARCHAR(MAX) = '' 

SELECT @COLS = COALESCE(@COLS + ', ', '') + QUOTENAME(PAYMONTH) 
FROM #DATA 
GROUP BY PAYMONTH, PM ORDER BY PM --pm is last date of paymonth for ordering data in asc/desc 

declare @QUERY AS NVARCHAR(MAX) = '' 

SET @QUERY = 'SELECT state, product, f_name, ' + @COLS + ' FROM 
(
    SELECT state, product, f_name, income, paymonth--, expense, saving, 
    FROM #DATA 
) X 
PIVOT 
(
     SUM(income) 
     FOR paymonth IN (' + @COLS + ') 
) P 
ORDER BY state, product, f_name' 
execute(@query) 

이 소득에 대한 paymonth에 피벗에 대한 올바른 결과를 줄 것이다하지만 난 3, 소득, 비용과 비용 절감을 위해 그것을 할 캔트.

시도해도 교차 적용 및 unpivot이 시도되었지만 실패했습니다.

도움이 필요하십니까? 감사합니다. .

답변

1

문제점은 소스 테이블의 비정규화된 구조입니다. 언제나 그렇듯이 이것은 질의에 어려움을 낳습니다. 이에서 동적 SQL을 구축

당신이 그 다음 피벗은 비교적 간단하다, unpivot를 사용하여 정상화하는 경우

...

select * 
from 
(
    select state,f_name,product, cost, paymonth+'_' +paytype as pp from #data 
    unpivot (cost for paytype in (income, expense, savings)) u 
) up 
pivot (sum(cost) for pp in 
    ([apr-2013_income],[apr-2013_expense],[apr-2013_savings],[may-2013_income] --, .... 
    ) 
) p 

는 독자들에게 운동으로 남아 있습니다.

+0

잘 작동하지 않을 때 필자는 피벗을하려 할 때 비용과 paytype이 누락되었습니다. 감사...!! – LeO

관련 문제