一个分类汇总的查询语句

huangyu12500 2012-02-10 11:14:32

姓名 类型
小王 A
小王 C
小红 B
李四 A
张三 C
小王 C
小王 B
小王 C
小红 C
李四 C


要求结果
姓名 A B C
小王 1 1 3
小红 0 1 1
李四 1 0 1
张三 0 0 1

select 姓名,SUM(类型) as 'A',sum(类型) as 'B',SUM(类型) AS 'C'
from 表 where 类型='A'OR 类型='B' OR 类型='C'
group by 姓名

我这样写但查出来的不是我想要的 ,求解答。。本人初学者,说的详细点 谢谢
...全文
93 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
紫竹林畔 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 huangyu12500 的回复:]
引用 1 楼 acherat 的回复:

SQL code

select 姓名,SUM((case when 类型='A' then 1 else 0 end)) as 'A',
SUM((case when 类型='B' then 1 else 0 end)) as 'B',
SUM((case when 类型='C' then 1 else 0 end)) as 'C'
fro……
[/Quote]

if not object_id('Tempdb..#tb') is null
drop table #tb
Go
Create table #tb([姓名] nvarchar(2),[类型] nvarchar(1))
Insert #tb
select N'小王',N'A' union all
select N'小王',N'C' union all
select N'小红',N'B' union all
select N'李四',N'A' union all
select N'张三',N'C' union all
select N'小王',N'C' union all
select N'小王',N'B' union all
select N'小王',N'C' union all
select N'小红',N'C' union all
select N'李四',N'C'
Go
Select [姓名],
[A],
[B],
[C],
A+B+C as Total
from #tb
pivot (count([类型]) for [类型] in([A],[B],[C] ))AS P
/*
姓名 A B C Total
---- ----------- ----------- ----------- -----------
小王 1 1 3 5
小红 0 1 1 2
李四 1 0 1 2
张三 0 0 1 1

(4 row(s) affected)


*/
AcHerat 元老 2012-02-10
  • 打赏
  • 举报
回复

select 姓名,SUM((case when 类型='A' then 1 else 0 end)) as 'A',
SUM((case when 类型='B' then 1 else 0 end)) as 'B',
SUM((case when 类型='C' then 1 else 0 end)) as 'C',
count(*) as 总和
from 表
group by 姓名
huangyu12500 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 acherat 的回复:]

SQL code

select 姓名,SUM((case when 类型='A' then 1 else 0 end)) as 'A',
SUM((case when 类型='B' then 1 else 0 end)) as 'B',
SUM((case when 类型='C' then 1 else 0 end)) as 'C'
fro……
[/Quote]
谢谢 如果再加个总和呢
姓名 A B C 总和
小王 1 1 3 5
小红 0 1 1 2
李四 1 0 1 2
张三 0 0 1 1
这个样子
勿勿 2012-02-10
  • 打赏
  • 举报
回复
--姓名 类型
--小王 A
--小王 C
--小红 B
--李四 A
--张三 C
--小王 C
--小王 B
--小王 C
--小红 C
--李四 C



if OBJECT_ID('tb')is not null
drop table tb
go
CREATE TABLE tb(姓名 varchar(50), 类型 varchar(50))
insert into tb values('小王', 'A')
insert into tb values('小王' ,'C')
insert into tb values('小红', 'B')
insert into tb values('李四', 'A')
insert into tb values('张三', 'C')
insert into tb values('小王', 'C')
insert into tb values('小王' ,'B')
insert into tb values('小王', 'C')
insert into tb values('小红', 'C')
insert into tb values('李四', 'C')

--要求结果
--姓名 A B C
--小王 1 1 3
--小红 0 1 1
--李四 1 0 1
--张三 0 0 1
SELECT 姓名
,(select count(类型) from tb where 姓名=t.姓名 and 类型='A') AS A
,(select count(类型) from tb where 姓名=t.姓名 and 类型='B') AS B
,(select count(类型) from tb where 姓名=t.姓名 and 类型='C') AS C
FROM tb t GROUP BY 姓名


姓名 A B C
-------------------------------------------------- ----------- ----------- -----------
李四 1 0 1
小红 0 1 1
小王 1 1 3
张三 0 0 1

(4 行受影响)

紫竹林畔 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 huangyu12500 的回复:]
谢谢了
select 姓名,SUM((case when 类型='A' then 1 else 0 end)) as 'A',
SUM((case when 类型='B' then 1 else 0 end)) as 'B',
SUM((case when 类型='C' then 1 else 0 end)) as 'C'
from 表
group by 姓名
这里的
……
[/Quote]
先这样看
然后再做的sum
select 姓名,case when 类型='A' then 1 else 0 end as 'A',
case when 类型='B' then 1 else 0 end as 'B',
case when 类型='C' then 1 else 0 end as 'C'
from 表
AcHerat 元老 2012-02-10
  • 打赏
  • 举报
回复
一个简单的判断,可以看看case when的用法,统计次数除了count还可以用sum(case when ... then 1 else 0 end) 的用法。
huangyu12500 2012-02-10
  • 打赏
  • 举报
回复
谢谢了
select 姓名,SUM((case when 类型='A' then 1 else 0 end)) as 'A',
SUM((case when 类型='B' then 1 else 0 end)) as 'B',
SUM((case when 类型='C' then 1 else 0 end)) as 'C'
from 表
group by 姓名
这里的
(case when 类型='A' then 1 else 0 end)是什么意思。可以说下么。。
紫竹林畔 2012-02-10
  • 打赏
  • 举报
回复
if not object_id('Tempdb..#tb') is null
drop table #tb
Go
Create table #tb([姓名] nvarchar(2),[类型] nvarchar(1))
Insert #tb
select N'小王',N'A' union all
select N'小王',N'C' union all
select N'小红',N'B' union all
select N'李四',N'A' union all
select N'张三',N'C' union all
select N'小王',N'C' union all
select N'小王',N'B' union all
select N'小王',N'C' union all
select N'小红',N'C' union all
select N'李四',N'C'
Go
Select [姓名],
[A],
[B],
[C]
from #tb
pivot (count([类型]) for [类型] in([A],[B],[C] ))AS P
/*
姓名 A B C
---- ----------- ----------- -----------
小王 1 1 3
小红 0 1 1
李四 1 0 1
张三 0 0 1

(4 row(s) affected)

*/
紫竹林畔 2012-02-10
  • 打赏
  • 举报
回复
select 姓名,
sum(case when 类型='A' then 1 else 0 end) A,
sum(case when 类型='A' then 1 else 0 end) B,
sum(case when 类型='A' then 1 else 0 end) C
from tb
group by 姓名
AcHerat 元老 2012-02-10
  • 打赏
  • 举报
回复

select 姓名,SUM((case when 类型='A' then 1 else 0 end)) as 'A',
SUM((case when 类型='B' then 1 else 0 end)) as 'B',
SUM((case when 类型='C' then 1 else 0 end)) as 'C'
from 表
group by 姓名

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧