zoukankan      html  css  js  c++  java
  • 借助另一个表进行 行转列的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

    解决办法:

     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
  • 相关阅读:
    Oracle 在64位机器上使用plSQL连接Oracle的问题(SQL*Net not properly installed)
    Bytes to be written to the stream exceed the Content-Length bytes size specified 解决方法
    Eclipse下建立geoserver源码工程
    (转)HttpWebRequest以UTF-8编码写入内容时发生“Bytes to be written to the stream exceed the Content-Length bytes size specified.”错误
    为nginx创建windows服务自启动
    (转)Nginx反向代理设置 从80端口转向其他端口
    从SNE到t-SNE再到LargeVis
    K NEAREST NEIGHBOR 算法(knn)
    从0开始用python实现神经网络 IMPLEMENTING A NEURAL NETWORK FROM SCRATCH IN PYTHON – AN INTRODUCTION
    Python和数据科学的起步指南
  • 原文地址:https://www.cnblogs.com/Spacecup/p/3572958.html
Copyright © 2011-2022 走看看