原始表中有时间列(dataTime)、名字列(nvchar)、是否本地(bit/bool) 这三个列。
我想通过一条sql语句,统计出 “每个名字、每一天 的本地数量 和非本地数量。”
这样说您可能有些糊涂。举个例子,就像如下两个表,我的目标是将原始数据表中的信息统计为目标表那个样子。原始数据表
 
时间              名字       是否本地
今天上午         张三          true                  
今天下午         张三          false                   
昨天上午         张三          true                  
昨天下午         张三          true                  
前天上午         张三          false                   
前天中午         张三          true                  
前天下午         张三          false                   
今天上午         李四          true        
今天中午         李四          false
今天下午         李四          false        
昨天上午         李四          false           
昨天中午         李四          true
昨天下午         李四          true                  
前天上午         李四          false                   
前天中午         李四          true                  
前天下午         李四          false       
           =============>
目标数据
 
时间        名字         本地数量           非本地数量              咨询总数
今天         张三         1                     1                    2
昨天         张三         2                     0                    2
前天         张三         1                     2                    3
今天         李四         1                     2                    3
昨天         李四         2                     1                    3
前天         李四         1                     2                    3
                注1:“时间”列为标准的datetime类型的列(日月年时分秒),写成昨天今天明天是方便大家理解
注2:“是否本地”列是bit类型,也就是程序中的bool类型。
注3:目标表统计的时间顺序为倒叙(就像上述目标表那个样子->从上到下是今天、昨天、前天。切勿反过来,因为用户更希望先看到最新日期的)。

解决方案 »

  1.   

    select c.时间列 ,c.名字列,SUM(本地数量) as 本地数量 ,SUM(非本地数量) as 非本地数量 ,SUM(本地数量+非本地数量) as  咨询总数
    from (
    select a.时间列 ,a.名字列, 
    sum(case when b.是否本地=1 then 1 else 0 end case ) as 本地数量,
    sum(b.是否本地=0 then 1 else 0 end case ) as 非本地数量
    from (select distinct convert(varchar(10),getdate(),120) as 时间列,名字列 from table1) as  a  left join 
    table1 as b on a.时间列=convert(varchar(10),b.时间列 ,120) and a.名字列=b.名字列
    ) as c group by 时间列 ,名字列
    没有测试,你试试吧
      

  2.   

    select datetime,[name],a.本地,b.非本地,a.本地+b.非本地 as 諮詢 from
    (select datetime,[name],count(*)as 本地 from table a where 是否本地=1 group by datetime,[name])a,
    (select datetime,[name],count(*)as 非本地 from table b where 是否本地=0 group by datetime,[name])b
    where a.datetime=b.datetime and a.[name]=b.[name]
      

  3.   

    if object_id('原始数据表') is not null drop table 原始数据表;
    gocreate table 原始数据表
    (
    时间 nvarchar(50) not null,
    名字 nvarchar(50) not null,
    是否本地 bit not null,
    )
    goinsert into 原始数据表
    select '今天', '张三', '1'
    union all select '今天', '张三', '0'
    union all select '昨天', '张三', '1'
    union all select '昨天', '张三', '1'
    goselect 时间, 名字, 
    (select count(*) from 原始数据表 where a.时间=时间 and a.名字=名字 and 是否本地= '1') as 本地数量, 
    (select count(*) from 原始数据表 where a.时间=时间 and a.名字=名字 and 是否本地= '0') as 非本地数量, 
    count(*) as 咨询总数
    from 原始数据表 a
    group by 时间, 名字
    order by 时间
      

  4.   


    if object_id('test') is not null drop table test;
    gocreate table test
    (
    col_datetime datetime not null,
    col_name nvarchar(50) not null,
    col_islocal bit not null
    )
    goselect c.col_datetime '时间',
           c.[col_name] '名字',
           SUM(sumlocal) as '本地数量',
           SUM(sumnoloacl) as '非本地数量',
           SUM(sumlocal + sumnoloacl) as '咨询总数'
      from (select a.col_datetime,
                   a.[col_name],
                   sum(case
                         when b.col_islocal = 1 then
                          1
                         else
                          0
                       end) as sumlocal,
                   sum(case 
         when b.col_islocal = 0 then 
          1 
                 else 
          0 end) as sumnoloacl
              from (select distinct convert(varchar(10), col_datetime, 120) as col_datetime,
                                    [col_name]
                      from test) as a
              left join test as b
                on a.col_datetime = convert(varchar(10), b.col_datetime, 120)
               and a.[col_name] = b.[col_name]
       group by a.col_datetime,a.[col_name]) as c
     group by col_datetime, [col_name]
      

  5.   


    DECLARE @TABLE TABLE (#时间列 datetime,#名字列 nvarchar(10),#是否本地 BIT)INSERT INTO @TABLE 
    SELECT GETDATE(),'张山',0 UNION ALL
    SELECT DATEADD(DD,1,GETDATE()),'张山',1 UNION ALL
    SELECT DATEADD(DD,2,GETDATE()),'张山',0 UNION ALL
    SELECT DATEADD(DD,1,GETDATE()),'李四',0 UNION ALL
    SELECT DATEADD(HH,1,GETDATE()),'李四',1 UNION ALL
    SELECT GETDATE(),'李四',1 
    SELECT Convert(varchar(10),#时间列,120) AS '时间'
      ,#名字列 AS '名字'
      ,SUM(CASE WHEN #是否本地=1 THEN 1 ELSE 0 END) AS '本地数量'
      ,SUM(CASE WHEN #是否本地=1 THEN 0 ELSE 1 END) AS '非本地数量'
      ,COUNT(1) AS '咨询总数'
    FROM @TABLE T GROUP BY Convert(varchar(10),#时间列,120),#名字列
    /*时间         名字         本地数量        非本地数量       咨询总数
    ---------- ---------- ----------- ----------- -----------
    2011-12-07 李四         2           0           2
    2011-12-08 李四         0           1           1
    2011-12-07 张山         0           1           1
    2011-12-08 张山         1           0           1
    2011-12-09 张山         0           1           1(5 行受影响)
    */
      

  6.   

    再在最后加上order by [col_name] desc, col_datetime desc 
    就跟楼主的效果一样了