借助另一个表进行 行转列的sql语句

一个小超市把很多商品分成了几个大类 ,例如生鲜类 粮油类 日杂类 糕点类 文具类
有一个表a
类别id 类别名称
1      生鲜类
2      粮油类
3      日杂类
4      糕点类
5      文具类
.......
每天要卖很多商品,商品有具体的名字 ,但都属于某一类
有个销售记录表
表b
纪录id   销售日期   类别名称  商品名称 价格
1         20130701  文具类  铅笔     10.00
2         20130701  文具类  橡皮     25.00
3         20130701  生鲜类  猪肉     5.50
4         20130702  文具类  尺子     3.20
。。。。。。

用户需要取某个时间段内每天的各种大类别的销售量,时间段由用户选择
如果从销售记录表进行行转列
是能够统计出结果的
但结果是如下这样
日期 生鲜类 文具类 合计
20130701 1   2   3
20130702 0   1   1
也就是如果时间段内某一类商品一个也没销售出去,那统计出来的结果就没有这个类别
我想用到类别表,让所有的类别都显示出来,如果没销售就是0 这个sql该如何写呢

也就是需要得到如下结果
日期 生鲜类 粮油类 日杂类 糕点类 文具类 合计
20130701 1   0    0   0   2   3
20130702 0   0    0   0   1   1

解决办法:

借助另一个表进行 行转列的sql语句
 1 create table a(类别id int,类别名称 varchar(10))
 2 insert into a values(1 , 生鲜类)
 3 insert into a values(2 , 粮油类)
 4 insert into a values(3 , 日杂类)
 5 insert into a values(4 , 糕点类)
 6 insert into a values(5 , 文具类)
 7 go
 8 create table b(纪录id int, 销售日期 datetime, 类别名称 varchar(10), 商品名称 varchar(10),价格 decimal(18,2))
 9 insert into b values(1 , 20130701, 文具类, 铅笔 , 10.00)
10 insert into b values(2 , 20130701, 文具类, 橡皮 , 25.00)
11 insert into b values(3 , 20130701, 生鲜类, 猪肉 , 5.50)
12 insert into b values(4 , 20130702, 文具类, 尺子 , 3.20)
13 go
14 
15 declare @dt1 as datetime
16 declare @dt2 as datetime
17 set @dt1 = 2013-07-01
18 set @dt2 = 2013-07-02
19 
20 declare @sql varchar(8000)
21 set @sql = select convert(varchar(8),m.销售日期,112) 日期 
22 select @sql = @sql +  , sum(case 类别名称 when ‘‘‘ + n.类别名称 + ‘‘‘ then 1 else 0 end) [ + 类别名称 + ]
23 from (select 类别名称 from a ) as n
24 set @sql = @sql +  , count(1) 合计 from b m where convert(varchar(8),m.销售日期,112) between ‘‘‘ + convert(varchar(8),@dt1,112) + ‘‘‘ and ‘‘‘ + convert(varchar(8),@dt2,112) + ‘‘‘ group by convert(varchar(8),m.销售日期,112)
25 exec(@sql) 
26 
27 /*
28 日期       生鲜类         粮油类         日杂类         糕点类         文具类         合计          
29 -------- ----------- ----------- ----------- ----------- ----------- ----------- 
30 20130701 1           0           0           0           2           3
31 20130702 0           0           0           0           1           1
32 */
33 
34 drop table a , b
借助另一个表进行 行转列的sql语句

借助另一个表进行 行转列的sql语句,布布扣,bubuko.com

借助另一个表进行 行转列的sql语句

上一篇:oracle数据库几个行之有效的优化方案


下一篇:Jdbc 连接MySQL数据库的方法和问题