当前位置: 代码迷 >> Sql Server >> 关于分组统计,怎么查询
  详细解决方案

关于分组统计,怎么查询

热度:12   发布时间:2016-04-24 10:04:36.0
关于分组统计,如何查询?
表结构是这样的:

ID       年级            班级                  科目
  1      一年级         一(1)班            语文
  2      一年级         一(1)班            数学
  3      一年级         一(2)班            语文
  4      一年级         一(2)班            数学
  5      一年级         一(1)班            语文
  6      一年级         一(1)班            数学
  7      二年级         二(1)班            语文
  8      二年级         二(1)班            历史
  9      二年级         二(2)班            语文
10      二年级         二(2)班            数学
.........

现在要这样的统计用户自由选择科目来组成需要统计数量的组,假设现在需要以  科目【语文】和【数学】 组合成 组,统计有多少组?

一、按照班级分类统计组,需要的结果:
年级            班级                  组数
一年级      一(1)班               2
一年级      一(2)班               1
二年级      二(1)班               0
二年级      二(2)班               1


二、按照年级分类统计组,需要的结果为:
年级          组数
一年级       3
二年级       1


这样的需求查询怎么实现呢?
------解决方案--------------------
select 年级,班级,
case when 语文>=数学 then 数学 else 语文 end as 组数
from (
select  年级,班级,
sum(case when 科目='语文' then 1 else 0 end) as 语文,
sum(case when 科目='数学' then 1 else 0 end) as 数学
 from tablename group by 年级,班级) a

select 年级,
case when 语文>=数学 then 数学 else 语文 end as 组数
from (
select  年级,
sum(case when 科目='语文' then 1 else 0 end) as 语文,
sum(case when 科目='数学' then 1 else 0 end) as 数学
 from tablename group by 年级) b
------解决方案--------------------
针对结果写法
use Tempdb
go
--> --> 
 
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] int,[年级] nvarchar(3),[班级] nvarchar(5),[科目] nvarchar(2))
Insert #T
select 1,N'一年级',N'一(1)班',N'语文' union all
select 2,N'一年级',N'一(1)班',N'数学' union all
select 3,N'一年级',N'一(2)班',N'语文' union all
select 4,N'一年级',N'一(2)班',N'数学' union all
select 5,N'一年级',N'一(1)班',N'语文' union all
select 6,N'一年级',N'一(1)班',N'数学' union all
select 7,N'二年级',N'二(1)班',N'语文' union all
select 8,N'二年级',N'二(1)班',N'历史' union all
select 9,N'二年级',N'二(2)班',N'语文' union all
select 10,N'二年级',N'二(2)班',N'数学'
Go
;
WITH    Class
          AS ( SELECT   a.年级
                       ,a.班级
                       ,a.科目
                       ,ROW_NUMBER() OVER ( PARTITION BY a.年级, a.班级, [科目] ORDER BY [科目] ) AS Row
               FROM     #T AS a
  相关解决方案