2017-04-05 10 views
0

열을 여러 열로 나누고 일부 열을 결합하고 싶습니다. SQL Server 2012에서 수정 작업을 수행하려면 어떻게해야합니까?SQL Server 2014 : 행이 적은 하나의 열에서 여러 개의 열로 어떻게 테이블을 피벗합니까?

입력

| Cust | Q  | Val  | 
------------------------------------ 
| 1  | 1  | 10  | 
| 2  | 2  | 20  | 
| 1  | 2  | 30  | 
| 4  | 4  | 40  | 
| 4  | 1  | 400  | 
| 4  | 2  | 4000 | 

출력 : 어떻게 여기에 입력에서 얻는 방법? 당신은 SQL 서버에서 다음과 같이 데이터를 트랜스 위해 SQL 서버에서 피벗을 사용할 수 있습니다

| Cust | ValQI | ValQII | ValQIII | VALQIV | 
----------------------------------------------------------------- 
| 1  | 10 | 30  |    |    | 
| 2  |   | 20  |    |    | 
| 3  |   |   |    |    | 
| 4  | 400 | 4000 |    |  40  | 
+0

몇 개의 다른 val ues in Q? – etsa

+0

@etsa는 매년 4 분기를 가지므로 10 년은 40 분기를 유지합니다. – hhh

+0

커스트 3으로 어떻게 출력합니까? 커스트 3과 함께 한 레코드가 누락 된 것 같아요? –

답변

2

결합 PIVOT LEFT OUTER

가입
WITH C AS 
(
    SELECT * 
    FROM (VALUES (1), (2), (3), (4)) AS T(Cust) 
) 
SELECT C.Cust, [1] AS ValQI, [2] AS ValQII, [3] AS ValQIII, [4] AS ValQIV 
FROM C 
LEFT OUTER JOIN 
(
    SELEcT * 
    FROM 
    (VALUES 
     (1, 1, 10), 
     (2, 2, 20), 
     (1, 2, 30), 
     (4, 4, 40), 
     (4, 1, 400), 
     (4, 2, 4000) 
    ) AS T(Cust, Q, Val) 
    PIVOT (MAX([Val]) FOR [Q] IN ([1], [2], [3], [4])) AS P 
) AS TT ON C.Cust = TT.Cust 
+0

'최대'가 무엇을 설명 할 수 있습니까? 이 사건은 값의 최대 값을 취하지 않으므로 그 이유가 의심 스럽습니다. – hhh

+1

PIVOT은 내부적으로 GROUP BY를 수행합니다. 그룹 내에서 가치를 얻는 방법은 무엇입니까? 귀하의 경우에는 중복이 없기 때문에 MIN/MAX/SUM/AVERAGE 일 수 있습니다. – qxg

+0

나는 90이 2005 년이고 2012가 110이라고 생각한다.'SELECT name, compatibility_level FROM sys.databases;'에 의해 호환성 레벨을 다시 확인하고 https://docs.microsoft.com/en-us/sql/t- sql/statements/alter-database-transact-sql-compatibility-level? – qxg

0

..

;with cte as (
select cust, RowN = Row_Number() over (partition by cust order by q), val from #yourPivot) 
select * from cte 
pivot (max(val) for RowN in ([1],[2], [3],[4])) p 

당신의 입력 테이블 :

create table #yourPivot (cust int, Q int, Val int) 

insert into #yourPivot (cust, q, val) values 
( 1 , 1  , 10  ) 
,( 2 , 2  , 20  ) 
,( 1 , 1  , 30  ) 
,( 4 , 4  , 40  ) 
,( 4 , 1  , 400 ) 
,( 4 , 2  , 4000 )