日期:2014-05-17  浏览次数:20429 次

统计分析
元数据

姓名 日期 分数
张三 1 10
张三 1 20
张三 1 30
李四 2 11
李四 2 22
王五 3 10
王五 3 10


效果
姓名 日期 分数
张三 1 10
  1 20
  1 30
  小计 60
李四 2 11
  2 22
  小计 33
王五 3 10
  3 10
  小计 20

------解决方案--------------------
SQL code
SELECT 姓名,日期,SUM(分数)分数 FROM TEST 
  GROUP BY 姓名,日期,分数
  WITH ROLLUP

------解决方案--------------------
SQL code
-->测试数据
declare @tab table(姓名 varchar(4) ,日期 varchar(1),分数 float(4))
insert into @tab 
select '张三','1','10'union all
select '张三','1','20'union all
select '张三','1','30'union all
select '李四','2','11'union all
select '李四','2','22'union all
select '王五','3','10'union all
select '王五','3','10'

-->开始查询
select 姓名,日期,sum(分数)as 小计,grouping(姓名)as checkxm,grouping(日期)as checkrq  from  @tab  group by 姓名,日期,分数 with rollup

-->结果集
/*
姓名     日期     小计  checkmc  checkrq
李四    2    11    0    0
李四    2    22    0    0
李四    2    33    0    0
李四    NULL    33    0    1
王五    3    20    0    0
王五    3    20    0    0
王五    NULL    20    0    1
张三    1    10    0    0
张三    1    20    0    0
张三    1    30    0    0
张三    1    60    0    0
张三    NULL    60    0    1
NULL    NULL    113    1    1

*/

/*提供一种思路,把这个结果集插入到临时表,
在根据临时表中增加的判断列checkmc和checkrq进行结果集的整理
*/

------解决方案--------------------
SQL code

declare @test table(姓名 nvarchar(4) ,日期 varchar(10),分数 float(4))
insert into @test 
select N'张三','1','10'union all
select N'张三','1','20'union all
select N'张三','1','30'union all
select N'李四','2','11'union all
select N'李四','2','22'union all
select N'王五','3','10'union all
select N'王五','3','10'
select 姓名,日期,分数 from 
(
    select 姓名,日期,分数,姓名+日期 as sort from @test
    union all
    select '','小计',sum(分数),姓名+日期+'1' from @test group by 姓名,日期
)t
order by sort
/*
姓名   日期         分数
---- ---------- ----------------------
李四   2          11
李四   2          22
     小计         33
王五   3          10
王五   3          10
     小计         20
张三   1          10
张三   1          20
张三   1          30
     小计         60
*/