首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求分组统计sql话语

2013-04-02 
求分组统计sql语句。数据库表Score如下:(只有0分、10分、20分、30分四种分数)姓名上午得分下午得分张三1020张

求分组统计sql语句。
数据库表Score如下:(只有0分、10分、20分、30分四种分数)
姓名  上午得分   下午得分
张三  10         20
张三  0          10
李四  20         0
李四  0          0
李四  30         20

通过sql语句得到

姓名  0分  10分  20分  30分
张三  1    2    1     0
李四  3    0    2     1

求解 sql 数据库
[解决办法]

----------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-03-31 01:00:04
-- Version:
--      Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (Intel X86) 
--Jun 17 2011 00:57:23 
--Copyright (c) Microsoft Corporation
--Enterprise Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)
--
----------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go 
create table [huang]([姓名] varchar(4),[上午得分] int,[下午得分] int)
insert [huang]
select '张三',10,20 union all
select '张三',0,10 union all
select '李四',20,0 union all
select '李四',0,0 union all
select '李四',30,20
--------------开始查询--------------------------

select [姓名] 
,[0分]=SUM(CASE WHEN  [上午得分]=0 AND  [下午得分]=0 THEN 2 WHEN [上午得分]=0 AND  [下午得分]<>0 THEN 1
WHEN [上午得分]<>0 AND  [下午得分]=0 THEN 1  ELSE 0 END )
,[10分]=SUM(CASE WHEN  [上午得分]=10 AND  [下午得分]=10 THEN 2 WHEN [上午得分]=10 AND  [下午得分]<>10 THEN 1
WHEN [上午得分]<>10 AND  [下午得分]=10 THEN 1  ELSE 0 END )
,[20分]=SUM(CASE WHEN  [上午得分]=20 AND  [下午得分]=20 THEN 2 WHEN [上午得分]=20 AND  [下午得分]<>20 THEN 1
WHEN [上午得分]<>20 AND  [下午得分]=20 THEN 1  ELSE 0 END )
,[30分]=SUM(CASE WHEN  [上午得分]=30 AND  [下午得分]=30 THEN 2 WHEN [上午得分]=30 AND  [下午得分]<>30 THEN 1
WHEN [上午得分]<>30 AND  [下午得分]=30 THEN 1  ELSE 0 END )
from [huang]
GROUP BY [姓名]
ORDER BY [姓名] DESC 

----------------结果----------------------------
/* 
姓名   0分          10分         20分         30分
---- ----------- ----------- ----------- -----------
张三   1           2           1           0


李四   3           0           2           1
*/


[解决办法]

--> 测试数据: @T
declare @T table (姓名 varchar(4),上午得分 int,下午得分 int)
insert into @T
select '张三',10,20 union all
select '张三',0,10 union all
select '李四',20,0 union all
select '李四',0,0 union all
select '李四',30,20
;with m as
(
select 姓名,上午得分 col from @T 
union all
select 姓名,下午得分 from @T
)
select 姓名,
sum(case when col=0 then 1 else 0 end) as [0分],
sum(case when col=10 then 1 else 0 end) as [10分],
sum(case when col=20 then 1 else 0 end) as [20分],
sum(case when col=30 then 1 else 0 end) as [30分]
from m group by 姓名 order by 姓名 desc
/*
姓名   0分          10分         20分         30分
---- ----------- ----------- ----------- -----------
张三   1           2           1           0
李四   3           0           2           1
*/

[解决办法]
select 姓名,
sum(case defen/10 when 0 then 1 else 0 end) as [0分],
sum(case defen/10 when 1 then 1 else 0 end) as [10分],
sum(case defen/10 when 2 then 1 else 0 end) as [20分],
sum(case defen/10 when 3 then 1 else 0 end) as [30分]
from (
select 姓名,defen=上午得分 from tb 
union all
select 姓名,defen=下午得分 from tb
) m group by 姓名 order by 姓名 desc

热点排行