• 交叉表.sql


    --示例

    --示例数据
    create table tb(ID int,Time datetime)
    insert tb select 1,'2005/01/24 16:20'
    union all select 2,'2005/01/23 22:45'
    union all select 3,'2005/01/23 0:30'
    union all select 4,'2005/01/21 4:28'
    union all select 5,'2005/01/20 13:22'
    union all select 6,'2005/01/19 20:30'
    union all select 7,'2005/01/19 18:23'
    union all select 8,'2005/01/18 9:14'
    union all select 9,'2005/01/18 18:04'
    go

    --查询处理:
    select     case when grouping(b.Time)=1 then 'Total' else b.Time end,
        [Mon]=sum(case a.week when 1 then 1 else 0 end),
        [Tue]=sum(case a.week when 2 then 1 else 0 end),
        [Wed]=sum(case a.week when 3 then 1 else 0 end),
        [Thu]=sum(case a.week when 4 then 1 else 0 end),
        [Fri]=sum(case a.week when 5 then 1 else 0 end),
        [Sat]=sum(case a.week when 6 then 1 else 0 end),
        [Sun]=sum(case a.week when 0 then 1 else 0 end),
        [Total]=count(a.week)
    from(
        select Time=convert(char(5),dateadd(hour,-1,Time),108)
                --时间交界点是1am,所以减1小时,避免进行跨天处理
            ,week=(@@datefirst+datepart(weekday,Time)-1)%7
                --考虑@@datefirst对datepart的影响
        from tb
    )a right join(
        select id=1,a='16:00',b='19:59',Time='[5pm - 9pm)' union all
        select id=2,a='20:00',b='23:59',Time='[9pm - 1am)' union all
        select id=3,a='00:00',b='02:59',Time='[1am - 4am)' union all
        select id=4,a='03:00',b='07:29',Time='[4am - 8:30am)' union all
        select id=5,a='07:30',b='11:59',Time='[8:30am - 1pm)' union all
        select id=6,a='12:00',b='15:59',Time='[1pm - 5pm)'
    )b on a.Time>=b.a and a.Time<b.b
    group by b.id,b.Time with rollup
    having grouping(b.Time)=0 or grouping(b.id)=1
    go

    --删除测试
    drop table tb

    /*--测试结果

                   Mon   Tue   Wed   Thu   Fri   Sat   Sun   Total
    -------------- ----- ----- ----- ----- ----- ------ ---- -------
    [5pm - 9pm)    0     1     2     0     0     0     0     3
    [9pm - 1am)    0     0     0     0     0     0     2     2
    [1am - 4am)    0     0     0     0     0     0     0     0
    [4am - 8:30am) 0     0     0     0     1     0     0     1
    [8:30am - 1pm) 0     1     0     0     0     0     0     1
    [1pm - 5pm)    1     0     0     1     0     0     0     2
    Total          1     2     2     1     1     0     2     9

    (所影响的行数为 7 行)
    --*/
  • 相关阅读:
    如何禁止复制网页内容?(javascript)
    CSS实现的div仿制Textarea效果
    C/S WinForm自定义控件实现B/S菜单样式
    ER/Studio 数据库建模
    设为首页JS,加入收藏夹js,加入收藏夹代码,设为首页代码,火狐和ie兼容
    entity framework进行一对多的联合查询
    增加asp.net应用程序性能的19种方法
    MVC Models定义验证属性
    [导入]linq与xml
    Entity Framework 批量删除
  • 原文地址:https://www.cnblogs.com/shihao/p/2506516.html
Copyright © 2020-2023  润新知