读书人

一个比较复杂的SQL语句关于行转列-

发布时间: 2013-01-20 10:22:40 作者: rapoo

一个比较复杂的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')

/*
固贷NULL50NULL
流贷NULLNULL50
其它NULLNULL100
总额80010001200*/


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

读书人网 >SQL Server

热点推荐