zoukankan      html  css  js  c++  java
  • 解决网友比较经典的SQL问题之数据查询汇总

    这是leoD网友提出的问题

    由于原来表结构过于复杂。所以模拟一个简单的。。

    person       date                   sum             t1         t2       t3       t4     t5 

    jack          2010-1-1                5                0          0        5        0       0

    jack          2010-1-10              0                0          0        0        0       0

    jack          2010-1-20              9                0          0        0        0       9

    tom          2010-1-               4                0          4        0        0       0

    tom          2010-1-9                6                0          0        0        6       0

    tom          2010-1-18              8                0          0        8        0       0

    .................................................

    t1.  .  .t5  最多只会有一个不为0,其余都为0、日期可以看做每天都有。

    要得到

    person    month      1   2    3   4  ....8  9  10 .....18   19     20 .......  31    (1.。31为日期。天、。表头应该是固定的,,不管有没有这天的数据。。)

    jack        2010-1     t3                                                     t5          

    tom        2010-1                 t2            t4            t3

    理论上应该遍历。T1..T2..T3...../..看哪个不为0.。然后取出表头。。。放新表里面。。。难点。。不会、、

    这个问题难点无非就是Sql查询汇总

    我随手打开了查询分析器先解决网友leoD的问题

      注释之后再补上

    首先先感谢leoD提出这个经典的问题

    有不懂的可咨询

    if object_id('zhuisuo')is not null
    drop table zhuisuo
    go
    create table zhuisuo
    (
    person
    varchar(20) null,
    date
    datetime null,
    [sum] int null,
    t1
    int null,
    t2
    int null,
    t3
    int null,
    t4
    int null,
    t5
    int null
    )

    insert into zhuisuo
    values('jack','2010-1-1',5,0,0,5,0,0)
    insert into zhuisuo
    values('jack','2010-1-10',0,0,0,0,0,0)
    insert into zhuisuo
    values('jack','2010-1-20',9,0,0,0,0,9)
    insert into zhuisuo
    values('tom','2010-1-3',4,0,4,0,0,0)
    insert into zhuisuo
    values('tom','2010-1-9',6,0,0,0,6,0)
    insert into zhuisuo
    values('tom','2010-1-18',8,0,0,8,0,0)
    insert into zhuisuo
    values('tom','2010-2-18',8,0,8,0,0,0)

    /*
    简单的注释一下
    我得到的信息是每月最多31天是固定的(当作结果集的列)
    表头只有t1,t2,t3,t4,t5
    所以简单的思路就是
      1、先把月和日分开来
      2、取t1,t2...表头
      3、运用PIVOT分组  分别把对应日期里的表头填充到该日期里去
    注:如果同一天有两个表头则去最大的那个表头max(tt)
    */
    select person,date,rq01,rq02,rq03,rq04,rq05,rq06,rq07,rq08,rq09,rq10,rq11,rq12,rq13,rq14,rq15,rq16,rq17,rq18,rq19,rq20,rq21,rq22,rq23,rq24,rq25,rq26,rq27,rq28,rq29,rq30,rq31
    from(select person,left(convert(varchar(10),date,102),7) date,
    case when t1>0 then 't1'
               
    when t2>0 then 't2'
               
    when t3>0 then 't3'
               
    when t4>0 then 't4'
               
    when t5>0 then 't5'
    end as tt,
    'rq'+right(convert(varchar(10),date,102),2) rq
    from zhuisuo) as a
    pivot(
    max(tt) for rq in([rq01],[rq02],[rq03],[rq04],[rq05],[rq06],[rq07],[rq08],[rq09],[rq10],[rq11],[rq12],[rq13],[rq14],[rq15],[rq16],[rq17],[rq18],[rq19],[rq20],[rq21],[rq22],[rq23],[rq24],[rq25],[rq26],[rq27],[rq28],[rq29],[rq30],[rq31])) as b 

    比较实用,你学到了吗?

    原文:http://www.cnblogs.com/zhuisuo/archive/2010/12/21/1912694.html

  • 相关阅读:
    【24点游戏】cocos2dx 源码
    『Python题库
    『Python题库
    【python安装】Windows上安装和创建python开发环境
    『Linux基础
    『Linux基础
    『Linux基础
    『Linux基础
    『Linux基础
    『Python基础-14』匿名函数 `lambda`
  • 原文地址:https://www.cnblogs.com/xiaopin/p/1913440.html
Copyright © 2011-2022 走看看