1. 程式人生 > >資料庫錶行轉列,列轉行終極方案

資料庫錶行轉列,列轉行終極方案

--行轉列問題
--建立測試環境
Create Table TEST
(DATES Varchar(6),
 EMPNO Varchar(5),
 STYPE Varchar(1),
 AMOUNT Int)
--插入資料
Insert TEST Select '200605',  '02436',     'A',        5
Union All Select '200605',  '02436',     'B',        3
Union All Select '200605',  '02436',     'C',        3 
Union All Select '200605',  '02436',     'D',        2
Union All Select '200605',  '02436',     'E',        9
Union All Select '200605',  '02436',     'F',        7
Union All Select '200605',  '02436',     'G',        6
Union All Select '200605',  '02438',     'A',        7
Union All Select '200605',  '02438',     'B',        8
Union All Select '200605',  '02438',     'C',        0 
Union All Select '200605',  '02438',     'D',        3
Union All Select '200605',  '02438',     'E',        4
Union All Select '200605',  '02438',     'F',        5
Union All Select '200605',  '02438',     'G',        1
GO
--測試
--如果STYPE固定,可以這麼寫
Select 
DATES,
EMPNO,
SUM(Case STYPE When 'A' Then AMOUNT Else 0 End) As A,
SUM(Case STYPE When 'B' Then AMOUNT Else 0 End) As B,
SUM(Case STYPE When 'C' Then AMOUNT Else 0 End) As C,
SUM(Case STYPE When 'D' Then AMOUNT Else 0 End) As D,
SUM(Case STYPE When 'E' Then AMOUNT Else 0 End) As E,
SUM(Case STYPE When 'F' Then AMOUNT Else 0 End) As F,
SUM(Case STYPE When 'G' Then AMOUNT Else 0 End) As G
From TEST
Group By DATES,EMPNO
Order By DATES,EMPNO

--如果STYPE不固定,用動態語句
Declare @S Varchar(1000)
Set @S=''
Select @[email protected]+',SUM(Case STYPE When '''+STYPE+''' Then AMOUNT Else 0 End) As '+STYPE From (Select Distinct STYPE From TEST) A Order By STYPE
Set @S='Select DATES,EMPNO'[email protected]+' From TEST Group By DATES,EMPNO Order By DATES,EMPNO'
EXEC(@S)
GO
--如果被轉置的是數字型別的話,應用下列語句
DECLARE @S VARCHAR(1000)
SET @S='SELECT DATES,EMPNO '
SELECT @

[email protected]+',['+STYPE+']=SUM(CASE WHEN STYPE='''+STYPE+''' THEN AMOUNT ELSE 0 END)'
FROM (Select Distinct STYPE From TEST) A Order By STYPE
SET @[email protected]+' FROM TEST GROUP BY DATES,EMPNO'
EXEC(@S) 

如果是列轉的話直接Union All就可以了

例如 :

city style      color 46 48 50 52
長沙 S6MF01002   152  1  2  2 1
長沙 S6MF01002   201  1  2  2 1
上面到下面的樣子
city   style          color size qty
長沙 S6MF01002       152    46  1
長沙 S6MF01002       152    48   2
長沙 S6MF01002       152    50   2
長沙 S6MF01002       152    52  1
長沙 S6MF01002       201    46  1
長沙 S6MF01002       201    48  2
長沙 S6MF01002       201    50  2
長沙 S6MF01002       201    52  1

Select City,Style,Color,[46] From Test
Union all 
Select City,Style,Color,[48] From Test
Union all 
Select City,Style,Color,[50] From Test
Union all 
Select City,Style,Color,[52] From Test

就可以了