zoukankan      html  css  js  c++  java
  • 经常用到的交叉表问题,一般用动态SQL能生成动态列

    原始表如下格式:
    Class     CallDate    CallCount
    1     2005-8-8    40
    1     2005-8-7    6
    2     2005-8-8    77
    3     2005-8-9    33
    3     2005-8-8    9
    3     2005-8-7    21

    根据Class的值,按日期分别统计出CallCount1,CallCount2,CallCount3。

    当该日期无记录时值为0 要求合并成如下格式:
    CallDate  CallCount1  CallCount2  CallCount3
    2005-8-9  0       0       33
    2005-8-8  40      77      9
    2005-8-7  6       0       21

    --创建测试环境
    Create table  T  (Class varchar(2),CallDate datetime, CallCount int)
    insert into T select '1','2005-8-8',40
    union all select '1','2005-8-7',6
    union all select '2','2005-8-8',77
    union all select '3','2005-8-9',33
    union all select '3','2005-8-8',9
    union all select '3','2005-8-7',21
    --动态SQL
    declare @s varchar(8000)
    set @s='select CallDate '
    select @s=@s+',[CallCount'+Class+']=sum(case when Class='''+Class+''' then CallCount else 0 end)'
    from T 
    group by Class
    set @s=@s+' from T group by CallDate order by CallDate desc '
    exec(@s)
    
    --结果
    
    CallDate                                               CallCount1  CallCount2  CallCount3  
    ------------------------------------------------------ ----------- ----------- ----------- 
    2005-08-09 00:00:00.000                                0           0           33
    2005-08-08 00:00:00.000                                40          77          9
    2005-08-07 00:00:00.000                                6           0           21
    
    --删除测试环境
    
    drop table T
    

  • 相关阅读:
    索引
    运算符优先级
    身份运算符
    成员运算符
    位运算符
    利用java编写物品的品牌、尺寸、价格、库存(新手)
    今天聊一聊nuxt.js(上)
    初入前端,面对一个项目应注意哪些?
    小型 Web 页项目打包优化方案
    跨域的那些事儿
  • 原文地址:https://www.cnblogs.com/smartsmile/p/6234400.html
Copyright © 2011-2022 走看看