我有下表:
PROCESS ID VOUCHER DATE CATEGORY_ID PROJECT AMOUNT ----------- ------------ ------------ ------- ------- 1001 12/03/13 Miscellaneous pnr 1000 1001 12/03/13 Miscellaneous pjk 2000 1002 20/07/13 Local Travel pnr 3000 1002 20/07/13 Local Travel npk 3400 1003 29/09/14 Miscellaneous jpg 1000 1004 23/10/13 Local Travel pnr 2000 1005 24/10/13 Miscellaneous pnr 1000 1005 24/10/13 Local Travel pnr 1000
在界面中,我将在某些日期(例如 20/01/13* 到 27/10/13) 之间提供 VOUCHER DATE ,我必须获得以下格式的输出: ***
CATEGORY_ID pnr npk jpg ----------- ----- ----- ----- Miscellaneous 1000 0 1000 Local Travel 6000 3400 0
的 PROJECT 是动态的,它可变化。
试试这个,它可以在SQL Server 2008中工作:
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) SELECT @cols = STUFF((SELECT ',' + PROJECT FROM (SELECT DISTINCT PROJECT FROM Table1 )sub FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') SET @query = 'SELECT * FROM ( SELECT CATEGORY_ID, PROJECT, AMOUNT FROM Table1 --WHERE VOUCHER_DATE BETWEEN '' AND '' ) AS T1 PIVOT (SUM(AMOUNT) FOR PROJECT IN ('+@cols+')) AS T2 ' EXEC(@query)
SQL小提琴
基本上,您使用动态SQL来设置项目列表,因为它可能有所不同,然后照常使用PIVOT,我注释了凭证日期标准,因为样本日期的格式不正确。如果某些项目被日期要求完全排除在外,那么您还将日期标准添加到设置项目列表的顶部。