2013-01-04 33 views
0

我有這樣的數據:怎麼行轉換爲列,如果列SQL服務器的數目不詳

MaGiangVienID | SoTiet1 | SoTiet2 | DateID 
79000G07.000206 |  60 | 60.00 |  t11 
79000G07.000206 |  54 | 54.00 |  t12 

我想我的結果是這樣的:

MaGiangVienID | SoTiet1_t11 | SoTiet2_t11 | SoTiet1_t12 | SoTiet2_t12 
79000G07.000206 |   60 |  60.00 |   54 |  54.00 

我不知道如何很多專欄因爲MaGiangVienID有很多DateID

請幫我!!非常感謝。

回答

1

對於這種類型的數據轉換,您需要同時應用UNPIVOTPIVOT函數。 UNPIVOT從多個列獲取數據並將其放入行中,然後PIVOT獲取行並將其轉換回列。

要執行UNPIVOT您轉換爲行的所有值必須是相同的數據類型,因此可能需要轉換。

逆透視

select MaGiangVienID, 
    value, 
    col +'_'+DateId col 
from 
(
    select MaGiangVienID, 
    cast(SoTiet1 as varchar(50)) SoTiet1, 
    cast(SoTiet2 as varchar(50)) SoTiet2, 
    DateID 
    from yourtable 
) src 
unpivot 
(
    value 
    for col in (SoTiet1, SoTiet2) 
) unpiv 

SQL Fiddle with Demo。在逆透視的結果是:

| MAGIANGVIENID | VALUE |   COL | 
----------------------------------------- 
| 79000G07.000206 | 60 | SoTiet1_t11 | 
| 79000G07.000206 | 60.00 | SoTiet2_t11 | 
| 79000G07.000206 | 54 | SoTiet1_t12 | 
| 79000G07.000206 | 54.00 | SoTiet2_t12 | 

正如你所看到的UNPIVOT生成帶有附加到它的結束了DateId新的列名。現在您應用PIVOT函數。

靜態PIVOT:

select MaGiangVienID, SoTiet1_t11, SoTiet2_t11, SoTiet1_t12, SoTiet2_t12 
from 
(
    select MaGiangVienID, 
    value, 
    col +'_'+DateId col 
    from 
    (
    select MaGiangVienID, 
     cast(SoTiet1 as varchar(50)) SoTiet1, 
     cast(SoTiet2 as varchar(50)) SoTiet2, 
     DateID 
    from yourtable 
) src 
    unpivot 
    (
    value 
    for col in (SoTiet1, SoTiet2) 
) unpiv 
) src 
pivot 
(
    max(value) 
    for col in (SoTiet1_t11, SoTiet2_t11, SoTiet1_t12, SoTiet2_t12) 
) piv 

SQL Fiddle with Demo

現在以上版本的偉大工程,如果你有一個已知數量DateId值的,但你說你不要這樣,你會想使用動態sql實現相同的查詢。

動態PIVOT:

DECLARE @colsUnpivot AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX), 
    @colsPivot as NVARCHAR(MAX) 

select @colsUnpivot = stuff((select ','+quotename(C.name) 
     from sys.columns as C 
     where C.object_id = object_id('yourtable') and 
       C.name not in ('MaGiangVienID', 'DateID') 
     for xml path('')), 1, 1, '') 

select @colsPivot = STUFF((SELECT DISTINCT ',' 
         + quotename(c.name + '_'+t.DateId) 
        from yourtable t 
        cross apply sys.columns as C 
        where C.object_id = object_id('yourtable') and 
         C.name not in ('MaGiangVienID', 'DateID') 

      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query 
    = 'select MaGiangVienID, '[email protected]+' 
     from 
     (
      select MaGiangVienID, value, col +''_''+DateId col 
      from 
      (
      select MaGiangVienID, 
       cast(SoTiet1 as varchar(50)) SoTiet1, 
       cast(SoTiet2 as varchar(50)) SoTiet2, 
       DateID 
      from yourtable 
     ) src 
      unpivot 
      (
      value 
      for col in ('[email protected]+') 
     ) unpiv 
    ) src 
     pivot 
     (
     max(value) 
     for col in ('+ @colspivot +') 
    ) p' 

exec(@query) 

SQL Fiddle with Demo

兩個版本產生相同的結果:

結果是:

| MAGIANGVIENID | SOTIET1_T11 | SOTIET2_T11 | SOTIET1_T12 | SOTIET2_T12 | 
--------------------------------------------------------------------------- 
| 79000G07.000206 |   60 |  60.00 |   54 |  54.00 | 

如果您沒有訪問至 UNPIVOT/PIVOT函數,那麼你可以複製查詢。該UNPIVOT功能可以使用UNION ALL複製和PIVOT可以使用CASE語句聚合函數產生:

select MaGiangVienID, 
    max(case when col = 'SoTiet1_t11' then value end) SoTiet1_t11, 
    max(case when col = 'SoTiet2_t11' then value end) SoTiet2_t11, 
    max(case when col = 'SoTiet1_t12' then value end) SoTiet1_t12, 
    max(case when col = 'SoTiet2_t12' then value end) SoTiet2_t12 
from 
(
    select MaGiangVienID, 'SoTiet1_t11' col, cast(SoTiet1 as varchar(50)) value 
    from yourtable 
    where DateID = 't11' 
    union all 
    select MaGiangVienID, 'SoTiet2_t11' col, cast(SoTiet2 as varchar(50)) value 
    from yourtable 
    where DateID = 't11' 
    union all 
    select MaGiangVienID, 'SoTiet1_t12' col, cast(SoTiet1 as varchar(50)) value 
    from yourtable 
    where DateID = 't12' 
    union all 
    select MaGiangVienID, 'SoTiet2_t12' col, cast(SoTiet2 as varchar(50)) value 
    from yourtable 
    where DateID = 't12' 
) src 
group by MaGiangVienID 

SQL Fiddle with Demo

所有版本都會產生相同的結果。

+0

@Khanh我不確定你是什麼意思,你從選擇命令獲得的數據?你在哪裏運行你當前的查詢? – Taryn