日期:2014-05-18  浏览次数:20505 次

sql动态列的问题, 专家来帮我解决啊。。
现有表 
  年度 月份 类别 汇总
  2008 4 书款 200
  2008 3 公车 300
  2008 5 书款 400
 ...


想转化为:
  3月份 4月份 5月份 。。。。。
书款 0 200 400
公车 300 0 0  
请问 高手应该如何实现 
 

------解决方案--------------------
SQL code
 
CREATE TABLE TB  (AYEAR INT,AMONTH INT,ATYPE VARCHAR(50),ASUM INT)
INSERT INTO TB SELECT 2008,4,'书款',200
UNION ALL SELECT 2008,3 ,'公车',300
UNION ALL SELECT 2008,5 ,'书款',5

DECLARE @SQL NVARCHAR(4000)
SET @SQL='SELECT ATYPE'
SELECT @SQL=@SQL+N','+QUOTENAME(AMONTH,N'''') +N'=SUM( CASE AMONTH WHEN '+QUOTENAME(AMONTH,N'''')+N'THEN ASUM ELSE 0 END)'
FROM TB
GROUP BY AMONTH
PRINT @SQL

EXEC (@SQL+N' FROM TB GROUP BY ATYPE ')
/*
ATYPE                        3      4      5     
-------------------------------------------------- ----------- ----------- -----------
公车                        300    0      0
书款                        0      200    5

*/


------解决方案--------------------

SQL code
DECLARE @SQL NVARCHAR(4000)
SELECT @SQL=isnull(@SQL,'')+N',SUM( CASE WHEN  AMONTH='''+Convert(nvarchar,AMONTH)+N''' THEN ASUM ELSE 0 END)'+QUOTENAME(Convert(nvarchar,AMONTH)+N'月份')
FROM TB 
GROUP BY AMONTH
exec('Select atype'+@sql +' from tb group by atype')