2017-11-19 6 views
0

오늘 제품 공급자로부터 데이터를 받았습니다.SQL Server의 데이터 변환

AdviserName|IF-Nov16|IF-Dec16|NB-Nov16|NB-Dec16|CN-Nov16|CN-Dec16|TotalPolcy|Provider| 
-----------|--------|--------|--------|--------|--------|--------|----------|--------| 
John Smith |$100 |$100 |$50  |$25.50 |-$20 |-$30 |12  |ANZ  | 
Adrian Ken |$200 |$250 |$1000 |$2000 |-$500 |-$700 |30  |AXA  | 

위의 표를 아래쪽으로 옮기는 방법은 무엇입니까?

AdviserName|Month|Year|Status|Amount  |TotalPolicy|Provider| 
-----------|-----|----|------|-----------|-----------|--------| 
John Smith |Nov |16 |IN |$100  |12   |ANZ  | 
John Smith |Dec |16 |IN |$100  |12   |ANZ  | 
John Smith |Nov |16 |NB |$50  |12   |ANZ  | 
John Smith |Dec |16 |NB |$25.50  |12   |ANZ  | 
John Smith |Nov |16 |CN |-$20  |12   |ANZ  | 
John Smith |Dec |16 |CN |-$30  |12   |ANZ  | 
Adrian Ken |Nov |16 |IN |$200  |30   |AXA  | 
Adrian Ken |Dec |16 |IN |$250  |30   |AXA  | 
Adrian Ken |Nov |16 |NB |$1000  |30   |AXA  | 
Adrian Ken |Dec |16 |NB |$2000  |30   |AXA  | 
Adrian Ken |Nov |16 |CN |-$500  |30   |AXA  | 
Adrian Ken |Dec |16 |CN |-$700  |30   |AXA  | 

지금까지 내가 한 일을, 엑셀 하나를 사용하여 데이터를 트랜스, 그리고 SQL에 다시 넣어 SQL에서 데이터를 다운로드 할 수 있습니다. 그러나 약 4000 행의 데이터가 있으며 나는 포기합니다.

이러한 데이터를 변환하는 쿼리를 작성하는 방법은 무엇입니까? SQL 서버 2012를 사용 중입니다.

감사합니다.

+0

'unpivot'문서를 살펴보십시오. https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx – tarheel

답변

2

는, 여기의 예입니다 (브래드 슐츠에 의해) unpivot 구문은 다음과 같습니다.

create table dbo.dataTable 
    (
     AdviserName varchar(100) 
     , [IF-Nov16] smallmoney 
     , [IF-Dec16] smallmoney 
     , [NB-Nov16] smallmoney 
     , [NB-Dec16] smallmoney 
     , [CN-Nov16] smallmoney 
     , [CN-Dec16] smallmoney 
     , TotalPolcy int 
     , [Provider] char(3) 
    ) 

insert into dbo.dataTable 
values ('John Smith', 100, 100, 50, 25.50, -20, -30, 12, 'ANZ') 
    , ('Adrian Ken', 200, 250, 1000, 2000, -500, -700, 30, 'AXA') 


select a.AdviserName 
, substring(a.col_nm, 4, 3) as [Month] 
, substring(a.col_nm, 7, 2) as [Year] 
, substring(a.col_nm, 1, 2) as [Status] 
, a.Amount 
, a.TotalPolcy 
, a.[Provider] 
from dbo.dataTable as dt 
unpivot (Amount for Col_Nm in ([IF-Nov16], [IF-Dec16], [NB-Nov16], [NB-Dec16], [CN-Nov16], [CN-Dec16])) as a 
+0

col_n의 재사용과 마찬가지로 http://rextester.com/PKKSJT2767 –

+0

을 참조하십시오. 내 평온함, IT WORKS !!!!!!! 1 백만 행과 ~ 50 행이 이와 같이 변환됩니다. 나는 스스로 결합하는 기술에 대해 생각해 왔고, 변환하는 데 Excel을 사용하고, 하나 하나 수동으로 처리하는 등의 작업을했습니다. 그러나 '피 핏'은 매력처럼 작동합니다. 고맙습니다. 사용할 새로운 SQL 기술입니다. –

+0

잘 작동했기 때문에 다행! – tarheel

2

T-SQL에서 unpivot 기능을 사용하거나 values을 사용하여 거의 WYSIWYG 레이아웃 인 cross apply을 사용할 수있는 간단한 구문이라고 생각되는 것을 사용할 수 있습니다. NB 새 행은 각 값의 새로운 형성된다 :

SELECT t.AdviserName, ca.Month, ca.Year, ca.Status, ca.Amount, t.TotalPolicy, t.Provider 
FROM YourTable t 
CROSS APPLY (
     ('Nov', 16, 'IN', t.[IF-Nov16]) 
     , ('Dec', 16, 'IN', t.[IF-Dec16]) 
     , ('Nov', 16, 'NB', t.[NB-Nov16]) 
     , ('Dec', 16, 'NB', t.[NB-Dec16]) 
     , ('Nov', 16, 'CN', t.[CN-Nov16]) 
     , ('Dec', 16, 'CN', t.[CN-Dec16]) 
    ) ca (Month, Year, Status, Amount) 

이 기술은 잘 여기 설명 : Spotlight on UNPIVOT, Part 1 당신이 원하는 경우

+0

예, Brad Schultz의 기술을 읽고 따라합니다. 그것은 매력처럼 작동합니다. 놀랄 만한. 고맙습니다. = D를 사용하는 것은 새로운 SQL 기술입니다. –

관련 문제