注册 登录
编程论坛 SQL Server论坛

[求助]归类查询

anjincheng 发布于 2007-01-26 10:31, 1364 次点击

各老师:
有表A
ID NAME ARRIVE
1 张三 迟到
2 李四 正常
3 张三 早退
4 王二 正常
5 麻子 正常
6 李四 请假
7 麻子 请假
8 王二 迟到
........................................

我想查询后,实现以下表B
姓名 迟到/次 早退/次 请假/次
张三 1 1 0
李四 0 0 1
王二 1 0 0
麻子 0 0 1

请问各老师,这样实现,谢谢!~

[此贴子已经被作者于2007-1-26 10:32:32编辑过]

13 回复
#2
棉花糖ONE2007-01-26 10:45
select name,sum(case ARRIVE when 迟到 then 1 else 0 end) as 迟到/次 ,sum(case ARRIVE when 早退 then 1 else 0 end) as 早退/次,
sum(case ARRIVE when 请假 then 1 else 0 end) as 请假/次 group by name
#3
Kendy1234562007-01-26 11:38

楼主发贴抬头的称呼看了有点儿寒~

#4
ninggang2007-01-30 14:40
有点象我们的一个同学
呵呵
#5
ninggang2007-01-30 14:42
sum(case ARRIVE when 迟到 then 1 else 0 end)
jinyuzhang
可以解释一下,这个东东吗?现在不在学校,手里没有这方面的资料,谢谢!!
#6
ninggang2007-01-30 14:43
case ARRIVE when 迟到
上面的这句话,倒是可以猜啊
不过这句话,有点不好猜
then 1 else 0 end
#7
棉花糖ONE2007-01-30 14:46

简单 CASE 函数:

CASE input_expression
WHEN when_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
END

CASE 搜索函数:

CASE
WHEN Boolean_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
END

参数
input_expression

是使用简单 CASE 格式时所计算的表达式。Input_expression 是任何有效的 Microsoft® SQL Server™ 表达式。

WHEN when_expression

使用简单 CASE 格式时 input_expression 所比较的简单表达式。When_expression 是任意有效的 SQL Server 表达式。Input_expression 和每个 when_expression 的数据类型必须相同,或者是隐性转换。

n

占位符,表明可以使用多个 WHEN when_expression THEN result_expression 子句或 WHEN Boolean_expression THEN result_expression 子句。

THEN result_expression

当 input_expression = when_expression 取值为 TRUE,或者 Boolean_expression 取值为 TRUE 时返回的表达式。result expression 是任意有效的 SQL Server 表达式。

ELSE else_result_expression

当比较运算取值不为 TRUE 时返回的表达式。如果省略此参数并且比较运算取值不为 TRUE,CASE 将返回 NULL 值。Else_result_expression 是任意有效的 SQL Server 表达式。Else_result_expression 和所有 result_expression 的数据类型必须相同,或者必须是隐性转换。

WHEN Boolean_expression

使用 CASE 搜索格式时所计算的布尔表达式。Boolean_expression 是任意有效的布尔表达式。

结果类型
从 result_expressions 和可选 else_result_expression 的类型集合中返回最高的优先规则类型。有关更多信息,请参见数据类型的优先顺序。

结果值
简单 CASE 函数:
计算 input_expression,然后按指定顺序对每个 WHEN 子句的 input_expression = when_expression 进行计算。


返回第一个取值为 TRUE 的 (input_expression = when_expression) 的 result_expression。


如果没有取值为 TRUE 的 input_expression = when_expression,则当指定 ELSE 子句时 SQL Server 将返回 else_result_expression;若没有指定 ELSE 子句,则返回 NULL 值。
CASE 搜索函数:
按指定顺序为每个 WHEN 子句的 Boolean_expression 求值。


返回第一个取值为 TRUE 的 Boolean_expression 的 result_expression。


如果没有取值为 TRUE 的 Boolean_expression,则当指定 ELSE 子句时 SQL Server 将返回 else_result_expression;若没有指定 ELSE 子句,则返回 NULL 值。

帮助里面的

#8
ninggang2007-01-30 14:51
好快呀!!
谢谢
#9
huangqi1142007-02-06 22:57

select name,迟到=sum(case
when ARRIVE='迟到' then 1
else
0
end),
早退=sum(case
when ARRIVE='早退' then 1
else
0
end),
请假=sum(case
when ARRIVE='请假' then 1
else
0
end)
from A
group by name
#10
初学Delphi2007-02-07 16:10

看看经典的sql语句那个帖子吧,看明白这个题目你就不用请教老师了
虽然不太一样,但你理解每一句的意思之后,就会觉得很简单

#11
allenduo2007-02-08 13:24
如果迟到早退1次以上,还可以这样计算么??
#12
初学Delphi2007-02-08 13:37
declare @a varchar(1000)
set @a='select name'
select @a=@a+',sum(case ARRIVE when '''+ARRIVE+''' then 1 else 0 end) ['+ARRIVE+']'
from (select distinct ARRIVE from a) as b
select @a=@a+' from a group by name'
exec (@a)
#13
初学Delphi2007-02-09 14:32
而且你上面用的case是知道"ARRIVE"这个字段有哪些值了,如果不知道呢?还是这个句子合适
#14
开小面追大奔2007-03-08 10:54
学会了~9楼的条理更清晰点~
1