实现行列转换
现有代码
if object_id('xmlTest') is not null
DROP TABLE xmlTest
create table xmltest(
id int identity(1,1),
iyear varchar(20),
imonth varchar(20),
iamount varchar(20)
)
insert into xmlTest (iyear,imonth,iamount)
select '2010','Jan','21900' union all
select '2010','Feb','19700' union all
select '2010','Mar','11800' union all
select '2010','Apr','11000' union all
select '2010','May','15000' union all
select '2010','Jun','11800' union all
select '2010','Jul','9800' union all
select '2010','Aug','21700' union all
select '2010','Sep','11700' union all
select '2010','Oct','11900' union all
select '2010','Nov','0' union all
select '2010','Dec','0' union all
select '2011','Jan','27400' union all
select '2011','Feb','29800' union all
select '2011','Mar','25800' union all
select '2011','Apr','26800' union all
select '2011','May','29600' union all
select '2011','Jun','32600' union all
select '2011','Jul','31800' union all
select '2011','Aug','36700' union all
select '2011','Sep','29700' union all
select '2011','Oct','31900' union all
select '2011','Nov','34800' union all
select '2011','Dec','24800' union all
select '2012','Jan','10000' union all
select '2012','Feb','11500' union all
select '2012','Mar','12500' union all
select '2012','Apr','15000' union all
select '2012','May','11000' union all
select '2012','Jun','9800' union all
select '2012','Jul','11800' union all
select '2012','Aug','19700' union all
select '2012','Sep','21700' union all
select '2012','Oct','21900' union all
select '2012','Nov','22900' union all
select '2012','Dec','20800'
--IF OBJECT_ID('xmlTest') IS NOT NULL
-- DROP TABLE xmlTest
--CREATE TABLE xmltest
-- (
-- id INT IDENTITY(1, 1) ,
-- iyear VARCHAR(20) ,
-- imonth VARCHAR(20) ,
-- iamount VARCHAR(20)
-- )
--INSERT INTO xmlTest
-- ( iyear ,
-- imonth ,
-- iamount
-- )
-- SELECT '2010' ,
-- 'Jan' ,
-- '21900'
-- UNION ALL
-- SELECT '2010' ,
-- 'Feb' ,
-- '19700'
-- UNION ALL
-- SELECT '2010' ,
-- 'Mar' ,
-- '11800'
-- UNION ALL
-- SELECT '2010' ,
-- 'Apr' ,
-- '11000'
-- UNION ALL
-- SELECT '2010' ,
-- 'May' ,
-- '15000'
-- UNION ALL
-- SELECT '2010' ,
-- 'Jun' ,
-- '11800'
-- UNION ALL
-- SELECT '2010' ,
-- 'Jul' ,
-- '9800'
-- UNION ALL
-- SELECT '2010' ,
-- 'Aug' ,
-- '21700'
-- UNION ALL
-- SELECT '2010' ,
-- 'Sep' ,
-- '11700'
-- UNION ALL
-- SELECT '2010' ,
-- 'Oct' ,
-- '11900'
-- UNION ALL
-- SELECT '2010' ,
-- 'Nov' ,
-- '0'
-- UNION ALL
-- SELECT '2010' ,
-- 'Dec' ,
-- '0'
-- UNION ALL
-- SELECT '2011' ,
-- 'Jan' ,
-- '27400'
-- UNION ALL
-- SELECT '2011' ,
-- 'Feb' ,
-- '29800'
-- UNION ALL
-- SELECT '2011' ,
-- 'Mar' ,
-- '25800'
-- UNION ALL
-- SELECT '2011' ,
-- 'Apr' ,
-- '26800'
-- UNION ALL
-- SELECT '2011' ,
-- 'May' ,
-- '29600'
-- UNION ALL
-- SELECT '2011' ,
-- 'Jun' ,
-- '32600'
-- UNION ALL
-- SELECT '2011' ,
-- 'Jul' ,
-- '31800'
-- UNION ALL
-- SELECT '2011' ,
-- 'Aug' ,
-- '36700'
-- UNION ALL
-- SELECT '2011' ,
-- 'Sep' ,
-- '29700'
-- UNION ALL
-- SELECT '2011' ,
-- 'Oct' ,
-- '31900'
-- UNION ALL
-- SELECT '2011' ,
-- 'Nov' ,
-- '34800'
-- UNION ALL
-- SELECT '2011' ,
-- 'Dec' ,
-- '24800'
-- UNION ALL
-- SELECT '2012' ,
-- 'Jan' ,
-- '10000'
-- UNION ALL
-- SELECT '2012' ,
-- 'Feb' ,
-- '11500'
-- UNION ALL
-- SELECT '2012' ,
-- 'Mar' ,
-- '12500'
-- UNION ALL
-- SELECT '2012' ,
-- 'Apr' ,
-- '15000'
-- UNION ALL
-- SELECT '2012' ,
-- 'May' ,
-- '11000'
-- UNION ALL
-- SELECT '2012' ,
-- 'Jun' ,
-- '9800'
-- UNION ALL
-- SELECT '2012' ,
-- 'Jul' ,
-- '11800'
-- UNION ALL
-- SELECT '2012' ,
-- 'Aug' ,
-- '19700'
-- UNION ALL
-- SELECT '2012' ,
-- 'Sep' ,
-- '21700'
-- UNION ALL
-- SELECT '2012' ,
-- 'Oct' ,
-- '21900'
-- UNION ALL
-- SELECT '2012' ,
-- 'Nov' ,
-- '22900'
-- UNION ALL
-- SELECT '2012' ,
-- 'Dec' ,
-- '20800'
DECLARE @s NVARCHAR(4000)
SET @s = ''
SELECT @s = @s + ',' + QUOTENAME(imonth) + '=max(case when [imonth]='
+ QUOTENAME(imonth, '''') + ' then [iamount] else 0 end)'
FROM xmlTest
GROUP BY imonth
--PRINT @s
EXEC('select [iyear]'+@s+' from xmlTest group by [iyear]')
/*
iyear Apr Aug Dec Feb Jan Jul Jun Mar May Nov Oct Sep
-------------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
2010 11000 21700 0 19700 21900 9800 11800 11800 15000 0 11900 11700
2011 26800 36700 24800 29800 27400 31800 32600 25800 29600 34800 31900 29700
2012 15000 19700 20800 11500 10000 11800 9800 12500 11000 22900 21900 21700
(3 行受影响)
*/
select iYear as Year ,
max(case iMonth when 'JAN' then iAmount else 0 end) JAN,
max(case iMonth when 'FEB' then iAmount else 0 end) FEB,
max(case iMonth when 'MAR' then iAmount else 0 end) MAR,
max(case iMonth when 'APR' then iAmount else 0 end) APR,
max(case iMonth when 'MAY' then iAmount else 0 end) MAY,
max(case iMonth when 'JUN' then iAmount else 0 end) JUN,
max(case iMonth when 'JUL' then iAmount else 0 end) JUL,
max(case iMonth when 'Aug' then iAmount else 0 end) Aug,
max(case iMonth when 'SEP' then iAmount else 0 end) SEP,
max(case iMonth when 'OCT' then iAmount else 0 end) OCT,
max(case iMonth when 'NOV' then iAmount else 0 end) NOV,
max(case iMonth when 'DEC' then iAmount else 0 end) DEC
from xmlTest
group by iYear