此查询将动态地生成输出你想要的。但是,因为您没有所有期间的值,所以插入了NULL(这是有效的)。如果要将值设为0而不是null,则必须修改查询并对每个字段使用ISNULL函数。
CREATE TABLE testTable (
Party NVARCHAR(20),
[Date] SMALLDATETIME, --done like this to get a TOTAL heading
Amount DECIMAL
)
INSERT INTO testTable VALUES
('AAA','3-Sep-13',1000),
('BBB','4-Jan-14',4000),
('BBB','5-Feb-14',1000),
('AAA','3-Dec-13',3000),
('CCC','7-Nov-13',800),
('DDD','15-Nov-13',1000),
('DDD','25-Jan-13',1000)
INSERT INTO testTable
SELECT Party, '2054-12-31', SUM(Amount) [Amount]
FROM testTable
GROUP BY Party
DECLARE @columnHeadings NVARCHAR(MAX)
SELECT @columnHeadings = COALESCE(
@columnHeadings + ',[' + CONVERT(NVARCHAR, [Date], 6) + ']',
'[' + CONVERT(NVARCHAR, [Date], 6)+ ']'
)
FROM testTable
GROUP BY [Date]
ORDER BY [Date]
DECLARE @sql NVARCHAR(MAX)
SET @sql = N'SELECT [party], ' + @columnHeadings + ' INTO ##output FROM ' +
'(SELECT [Party], [Amount], CONVERT(NVARCHAR, [Date], 6) [Date] FROM testTable ) [source]' +
' PIVOT ' +
'(SUM(Amount) FOR [Date] IN (' + @columnHeadings +')) [pvt];'
EXEC(@sql)
EXEC tempdb.sys.sp_rename '##output.[31 Dec 54]', 'Total', 'COLUMN'
SELECT * FROM ##output
DROP TABLE testTable
DROP TABLE ##output
声明:我不喜欢这段代码。但它的工作。
你的照片不清楚。请使用SQL代码创建您的表格以及一些示例行。这将有所帮助。 –
你的尝试在哪里? –
是否可以通过查看或必须使用存储过程? – haroon