求一个比较复杂的SQL语句,字段值作为列名的方法
A表为商品分类,表结构如下
id name
1 电子类
2 服务类
3 虚拟类
B表为商品名称和价格,其中AID代表商品分类ID
id Aid name price
1 1 电脑 3000
2 1 鼠标 30
3 1 键盘 20
4 2 维修 50
5 3 点卡 30
C表为销售单据主表
id custom account
1 张三 3080
2 李四 80
D为单据明细表,即客户都买了什么东西,bid代表销售单主表的ID ,mid代表商品ID
id bid mid account
1 1 1 3000 --张三买了一台电脑
2 1 4 50 --张三购买了维修服务
3 1 2 30 --张三买了一个鼠标
4 2 4 50 --李四买了维修服务
5 2 3 30 --李四买了一个键盘
现在要求制作一张明细表,要求按照单据主表显示行,商品分类在购买的商品前方显示,并显示出汇总数,商品名以列的形式表现出来,列的值就是购买商品的金额.
这张表做完应该是下面这样
客户名 电子类 电脑 键盘 鼠标 服务类 维修 虚拟类 点卡
张三 3020 3000 30 50 50
李四 30 30 50 50
难点在于商品名称和购买的东西不固定.
求这个报表制作的方法 .SQL语句 存储过程 视图 什么方式都行 只要能做出来就行
数据库类型是 SQL SERVER 2008 展开
什么数据库?
我现在只能给你显示成这样,是不是不太满足?就是那汇总不好汇
不过我借助了一个视图和一个declare动态执行的,没把你的内容写死
-----------搞定了---------
先创建视图
create view v_e as
select c.custom,a.name proname,sum(d.account) as account
from a,b,c,d where a.id=b.aid and c.id=d.bid and d.mid=b.id
group by c.custom,a.name
union all
select c.custom,b.name proname,sum(d.account) as account
from a,b,c,d where a.id=b.aid and c.id=d.bid and d.mid=b.id
group by c.custom,b.name
然后
declare @sql varchar(4000)
set @sql = 'select [custom]'
select @sql = @sql + ',sum(isnull(case [proname] when '''+[name]+''' then [account] end,0)) as
['+[name]+']'
from (select top 1000 name from
(select name,'t1' t,id from a
union all
select name,'t2' t,aid id from b) c
order by id,t) as a
select @sql = @sql+' from [v_e] group by [custom]'
exec(@sql)