您的位置:首页 > 其它

行转列问题(只要在CSDN混过的人都会)

2008-03-17 19:11 190 查看
--行转列问题

--建立測試環境

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 @S=@S+',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'+@S+' From TEST Group By DATES,EMPNO Order By DATES,EMPNO'

EXEC(@S)

GO

--如果被转置的是数字类型的话,应用下列语句

DECLARE @S VARCHAR(1000)

SET @S='SELECT DATES,EMPNO '

SELECT @S=@S+',['+STYPE+']=SUM(CASE WHEN STYPE='''+STYPE+''' THEN AMOUNT ELSE 0 END)'

FROM (Select Distinct STYPE From TEST) A Order By STYPE

SET @S=@S+' FROM TEST GROUP BY DATES,EMPNO'

EXEC(@S)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: