求应付款减已付款得出未付款及付款比值

求应付款减已付款得出未付款及付款比率
表A(应付款明细)有A1(年月日),A2(供应商编号),A3(发票类型),A4(应付金额)列数据如下:
A1                 A2      A3     A4
20141102   zz1     Y       800
20141115   zz1     Y       999
20141116   zz1     N       444
20141202   zz1     Y       555
20141127   as1     Y       333
20141127   as1     Y       222
20141129   as1     N       110
20141210   as1     Y       800

表B(已付款明细)有B1(年月日),B2(供应商编号),B3(已付款金额)列数据如下:
B1                 B2      B3
20141105   zz1     100
20141128   zz1     200
20141214   zz1     300
20141130   as1     150
20141219   as1     300
20141226   as1     200

需求结果如下
Y1    201411月   201412月   应付款合计   201411月   201412月   已付款合计   未付款合计  全年已付款比率(%)
zz1   1355       555        1910         300        300        600          1310        31.41
as1   445        800        1245         150        500        650          595         52.21

A表与B表由A2=B2进行关联
应付款合计列:按月统计(当A3列为Y时将A4列数据相加)-(当A3列为N时将A4列数据相加)
已付款合计列:全计已付款金额合计
未付款合计列:应付款合计列 - 已付款合计列
全年已付款比率列:已付款合计列 / 应付款合计
以上只是列出11与12月份的应付款
报表需可按某个月,某几个月进查询

创建表

CREATE TABLE [dbo].[A](
[A1] [char](8) NOT NULL,
[A2] [char](4) NOT NULL,
[A3] [char](2) NOT NULL,
[A4] [numeric](18, 0) NULL)

INSERT INTO A VALUES('20141102','zz1','Y',800)
INSERT INTO A VALUES('20141115','zz1','Y',999)
INSERT INTO A VALUES('20141116','zz1','N',444)
INSERT INTO A VALUES('20141202','zz1','Y',555)
INSERT INTO A VALUES('20141127','as1','Y',333)
INSERT INTO A VALUES('20141127','as1','Y',222)
INSERT INTO A VALUES('20141129','as1','N',110)
INSERT INTO A VALUES('20141210','as1','Y',800)

SELECT * FROM A

------------------------------------------------

CREATE TABLE [dbo].[B](
[B1] [char](8) NOT NULL,
[B2] [char](4) NOT NULL,
[B3] [numeric](18, 0) NULL)

INSERT INTO B VALUES('20141105','zz1',100)
INSERT INTO B VALUES('20141128','zz1',200)
INSERT INTO B VALUES('20141214','zz1',300)
INSERT INTO B VALUES('20141130','as1',150)
INSERT INTO B VALUES('20141219','as1',300)
INSERT INTO B VALUES('20141226','as1',200)

SELECT * FROM B
------解决思路----------------------
DECLARE @SQL VARCHAR(8000),@COLUMN1 VARCHAR(8000),@COLUMN2 VARCHAR(8000)
SET @COLUMN1=''
SET @COLUMN2=''
SELECT @COLUMN1=@COLUMN1+',SUM(CASE WHEN T=1 AND CAST([A1]AS VARCHAR(6))='''+CAST([A1]AS VARCHAR(6))+''' THEN[A4]END)['+CAST([A1]AS VARCHAR(6))+'月]'
FROM A GROUP BY CAST([A1]AS VARCHAR(6))ORDER BY CAST([A1]AS VARCHAR(6))
SET @COLUMN1=@COLUMN1+',SUM(CASE WHEN T=1 THEN[A4]END)[应付款合计]'
SELECT @COLUMN2=@COLUMN2+',SUM(CASE WHEN T=2 AND CAST([A1]AS VARCHAR(6))='''+CAST([B1]AS VARCHAR(6))+''' THEN[A4]END)['+CAST([B1]AS VARCHAR(6))+'月]'
FROM B GROUP BY CAST([B1]AS VARCHAR(6))ORDER BY CAST([B1]AS VARCHAR(6))
SET @COLUMN2=@COLUMN2+',SUM(CASE WHEN T=2 THEN[A4]END)[已付款合计]'
SET @SQL='SELECT[A2]'+@COLUMN1+@COLUMN2+',SUM(CASE WHEN T=1 THEN[A4]END)-SUM(CASE WHEN T=2 THEN[A4]END)[未付款合计]'
+',100.0*SUM(CASE WHEN T=2 THEN[A4]END)/SUM(CASE WHEN T=1 THEN[A4]END)[全年已付款比率(%)]'
+'FROM(SELECT 1 T,[A1],[A2],[A4]FROM A WHERE[A3]=''Y''
UNION ALL SELECT 1 T,[A1],[A2],-[A4]FROM A WHERE[A3]=''N''
UNION ALL SELECT 2,[B1],[B2],[B3]FROM B)T'
+' GROUP BY[A2]'
EXEC(@SQL)
动态执行