2014-02-25 97 views
-2

客户自今日起6个月账龄账龄报告。SQL查询月明智账龄报告

表中数据就像是以下几点:

Customer Date  Amount 
    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 
    CCC   8-Nov-13 1000 

我需要一个SQL查询来获取以下结果和航向应在一个月和一年

Party name Sep-13 Oct-13 Nov-13 Dec-13 Jan-14 Feb-14 Total Amount 
    AAA   1000  0  0  3000  0  0  4000 
    BBB   0   0  0  4000  1000  0  5000 
    CCC   0   0  1800 0  0  0  1800 
    DDD   0   0  1000 0  1000  0  2000 
+1

你的照片不清楚。请使用SQL代码创建您的表格以及一些示例行。这将有所帮助。 –

+2

你的尝试在哪里? –

+0

是否可以通过查看或必须使用存储过程? – haroon

回答

0

此查询将动态地生成输出你想要的。但是,因为您没有所有期间的值,所以插入了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 

声明:我不喜欢这段代码。但它的工作。

+0

你的结果是好的,但标题也显示日期,它应该是obly月和年,数据也应该是明智的日期不明智 – haroon

+0

这应该很简单,让你改变。大部分问题都得到了解答。你只需要改变CONVERT(NVARCHAR,[Date],6)部分,并根据需要设置日期格式。 – Stuart