2014-01-20 2 views
1

원본 테이블에서 개별 항목을 매주 요약하려고합니다. 어떤 항목이 반환되지 않을 경우 쿼리는 내가이 함께 아래의 쿼리를 넣을 수 있었다 null 값 SQL Transpose Pivot

Original Table 
+-------+-----------+----------+-----------+-------+------+ 
|ITEMID | Date  |ItemType |Account No |Amt | Desc | 
+-------+-----------+----------+-----------+-------|------| 
|10  |2014-01-01 | Doors |12345  |10  | ab | 
+-------+-----------+----------+-----------+-------|------| 
|10  |2014-01-02 | Doors |12345  |10  | cd | 
+-------+-----------+----------+-----------+-------|------| 
|10  |2014-01-03 | Doors |12345  |10  | ef | 
+-------+-----------+----------+-----------+-------|------| 
|10  |2014-01-04 | Doors |12345  |10  | gh | 
+-------+-----------+----------+-----------+-------|------| 
|10  |2014-01-05 | Doors |12345  |10  | ij | 
+-------+-----------+----------+-----------+-------|------| 
|10  |2014-01-06 | Doors |12345  |10  | kl | 
+-------+-----------+----------+-----------+-------|------| 
|10  |2014-01-07 | Doors |12345  |10  | mn | 
+-------+-----------+----------+-----------+-------|------| 

target table: 

+----------+-----------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+ 
| ItemType | AccountNo | Amt1 | DESC1 | Amt2 | Desc2 | Amt3 | Desc3 | Amt4 | Desc4 | Amt5 | Desc5 | Amt6 | Desc6 | Amt7 | Desc7 | 
+----------+-----------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+ 
| Doors | 1234  | 10 | ab | 11 | cd | 12 | ef | 13 | gh | 14 | ij | 15 | kl | 16 | mn | 
+----------+-----------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+------+-------+ 

를 반환해야합니다, 을 (등 즉, 문, 창문,) 지정된 각 항목 유형에 대해 한 행을 반환해야 작업을 아래의 답변을 기반으로하지만, 더 효율적이고 효율적인 방법이 있습니까 ???? amt4, desc4 t4.desc AS, AS amt5 t5.amt, desc5 t5.desc AS, AS amt6 t6.amt, desc6 t6.desc AS, AS amt7 t7.amt, T7 AS

SELECT t1.Amt AS amt1, t1.desc AS desc1, t2.amt AS amt2, t2.desc AS desc2,t3.Amt AS amt3, t3.desc AS desc3 

t4.amt .desc AS desc7, from mytable t1 INNER JOIN mytable t2 ON t2.date = '2014-01-01'AND t2.itemid = 10 AND t2.type = '문' INNER JOIN mytable t3 ON t3.date = '2014-01-02'AND t3.itemid = 10 AND t3.type = '문' INNER JOIN mytable t3 ON t3.date = '2014-01-03'AND t3.itemid = 10 AND t4.type = ' 문 ' 내부 조인 mytable t3 켜기 t3.date ='2014-01-04 'AND t3.itemid = 10 AND t5.type ='문 ' 내부 조인 mytable t3 켜기 t3.date ='2014-01-05 ' AND t3.itemid = 10 AND t6.type = '문',691,363,210 INNER t3.date가 ON MYTABLE T3 가입 = '2014년 1월 6일'AND t3.itemid = 10 AND t7.type = '문' t1.itemid = 10 AND t1.type = '문'

답변

0
select 
t1.Amount as [Jan 1 Amount], 
t1.Description as [Jan 1 Desc.], 
t2.Amount as [Jan 2 Amount], 
t2.Description as [Jan 2 Desc.], 
t3.Amount as [Jan 3 Amount], 
t3.Description as [Jan 3 Desc.], 
from table t1 
inner join table t2 on t2.date='jan 2' 
inner join table t3 on t3.date='jan 3' 
where t1.date='jan 1' 
0

는 열을 알 수없는 경우에 당신이 Dyanmic 피벗을 사용할 수 있습니다 PIVOT

select 
[Jan 1Amount], [Jan 1Desc], [Jan 2Amount], 
[Jan 2Desc], [Jan 3Amount], [Jan 3Desc] 
from 
(
    select 
    [date] + column as column, value 
    from Table1 
cross apply 
(
select 'Amount', convert(varchar(20),[Amount]) union all 
select 'Desc', [Description] 
) a (column, value) 
) b 
pivot 
(
max(value) 
for column in ([Jan 1Amount], [Jan 1Desc], [Jan 2Amount], 
      [Jan 2Desc], [Jan 3Amount], [Jan 3Desc]) 
) pi; 

SQL FIDDLE DEMO

를 사용해보십시오

DECLARE @cols AS NVARCHAR(MAX), 
@query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME([Date] + ' ' + col) 
       from Table1 
       cross apply 
       (select 'Amount', convert(varchar(20),[Amount]) 
       union all 
       select 'Desc', [Description] 
       ) c (col, so) 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 


set @query = 'SELECT ' + @cols + ' 
     from 
     (
      select 
      [date] +'' '' + col as col, value 
      from Table1 
     cross apply 
     (
      select ''Amount'', convert(varchar(20),[Amount]) 
      union all 
      select ''Desc'', [Description] 
     ) c (col, value) 
     ) x 
     pivot 
     (
      max(value) 
      for col in (' + @cols + ') 
     ) p ' 


execute sp_executesql @query; 

SQL FIDDLE DEMO