日期:2014-05-17  浏览次数:20508 次

一个比较复杂的SQL语句,关于行转列--------高手请进
这个SQL整了几天了,大家帮看一下,谢了.


有两个表结构如下,要求生成最后的报表格式
银行名有很多个,而且一个公司可能贷几家银行,或贷几次,贷款类型有几种.



1.银行表

银行名    总额
-------   -----
农业银行  1000
工商银行  800
商业银行  1200
....


2.贷款记录表

公司名  贷款金额  类型    贷款银行
------  --------- ----   ---------
A公司   50       固贷    农业银行
A公司   50       流贷    商业银行
B公司   100      其它    商业银行
.....


要求生成的SQL视图如下:
(银行有很多,类型也不一定,如果太复杂,类型就那上面三种也行)

类型       农业银行  工商银行  商业银行.....
----      ---------- -------- ------- 
总额      1000        800       1200 ....
已用总计  50          0         150 .....

固贷合计  50          0          0
流贷合计  0           0         50
其它合计  0           0         100
...

------解决方案--------------------
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 银行名 from (SELECT '总额' AS '类型',总额 AS mon,银行名 FROM 银行表
UNION ALL
SELECT 类型,贷款金额 AS mon,贷款银行 AS  银行名 FROM 贷款记录表)T group by 银行名
set @sql = '[' + @sql + ']'


exec ('select * from (select * from (SELECT ''总额'' AS ''类型'',总额 AS mon,银行名 FROM 银行表
UNION ALL
SELECT 类型,贷款金额 AS mon,贷款银行 AS  银行名 FROM 贷款记录表)T
  ) a pivot (max(mon) for 银行名 in (' + @sql + ')) b')

/*
固贷 NULL 50 NULL
流贷 NULL NULL 50
其它 NULL NULL 100
总额 800 1000 1200*/


剩下合计相关,lz自己处理一下即可。 动态处理行列转换,lz参考精华帖。