sql 单表查询语句 求高手帮忙

作者&投稿:糜雁 (若有异议请与网页底部的电邮联系)
求几个简单的SQL单表分组查询语句~

如果最高分不只一个呢.....

select * from Result where grade=1 and gender='男' and score = (select max(score) from result);

select * from Result where grade=1 and score=(select max(score) from Result);

select * from Result where gender='女'and score=(select max(score) from Result);

select * from Result where score in (select max(score) from Result group by grade);
注:
grade 年级
name 姓名
gender 性别
score 分数
谁用谁知道!

if exist (select * from d where a1=1 and b1=1) select c.姓名 from c where c.单位 = a1 and c.部门= b1

union

if exist (select * from d where a2=1 and b2=1) select c.姓名 from c where c.单位 = a2 and c.部门= b2

union

if exist (select * from d where a3=1 and b3=1) select c.姓名 from c where c.单位 = a3 and c.部门= b3

以上只是个思路,没有测试,你的单位和部门恐怕不止3个,所以这种方法也不好,需要用程序循环生成sql语句。

这个表设计的不好,行列倒置了,建议修改表结构。

或者先读取数据到数组中,再做查询:

数组arrayc = select * from c
for i=0 to ubound(arrayc,2)
sql = " select * from d where " & arrayc(1,i) & " = 1 and " & arrayc(2,i) & " = 1"
if .eof then
arrayc(0,i) = “” '如果不存在就将姓名清空,最后数组中有姓名的满足要求
end if
next

提示:以上方式严重消耗数据库资源,还是修改表结构吧

--总出席的天数
DECLARE @day_count int
select @day_count=count(*) from
(select substring(convert( varchar(10),signtime,120),1,10) a from sign group by substring(convert( varchar(10),signtime,120),1,10)) s;

--考勤表中出现的人
select m1.userid,m1.应考天数,m2.签到次数,m3.签退次数,ISNULL(m4.迟到次数,0) 迟到次数,ISNULL(m5.早退次数,0) 早退次数 from (
select userid,@day_count 应考天数 from sign group by userid) m1 left join (
--每人签到的次数
select count(signid) 签到次数, userid from sign where signflag=1 group by userid ) m2 on m1.userid=m2.userid left join(
--每人签退的次数
select count(signid) 签退次数, userid from sign where signflag=0 group by userid ) m3 on m1.userid=m3.userid left join (
--每人迟到次数
select count(signid) 迟到次数, userid from sign where signflag=1 and convert(varchar(5) ,signtime,114)>'08:00' group by userid ) m4 on m1.userid=m4.userid left join (
--每人早退次数
select count(signid) 早退次数, userid from sign where signflag=0 and convert(varchar(5) ,signtime,114)<'18:00' group by userid) m5 on m1.userid=m5.userid

--把这些语句再用left join 连在一起想要啥就有啥了,都到这步了计算你自己来吧

假设8点上班,18点下班。
出勤是指有签到,而旷工是指签退;
迟到的定义是指8点以后签到;
早退的定义是指18点以前签退;
另外,以下情况不作考虑:
输入的开始时间 < 结束时间
不考虑节假日,不考虑重名,

WITH cte_S([userId],[signTime],[mark]) AS (
SELECT [userId],[signTime],[mark]
FROM [Sign]
WHERE [signTime] BETWEEN @DateBegin AND @DateEnd
AND (DATEPART(DW,[signTime]) BETWEEN 2 AND 6)
)
SELECT DISTINCT [userId],
(SELECT COUNT(*)
FROM cte_S
WHERE ([userId] = tblM.[userId])
AND ([mark] = 1)
) AS [出勤率],
(SELECT COUNT(*)
FROM cte_S
WHERE ([userId] = tblM.[userId])
AND ([mark] = 1)
AND (DATEPART(HH,[signTime]) > 8)
) AS [迟到次数],
(SELECT COUNT(*)
FROM cte_S
WHERE ([userId] = tblM.[userId])
AND ([mark] = 0)
AND (DATEPART(HH,[signTime]) < 17)
) AS [早退次数],
(SELECT (DATEPART(WK,@DateEnd) - DATEPART(WK,@DateBegin)) * 5 + CASE
WHEN (DATEPART(DW,@DateBegin) < DATEPART(DW,@DateEnd))
THEN (DATEPART(DW,@DateEnd) - DATEPART(DW,@DateBegin) + 1)
ELSE
0 - (DATEPART(DW,@DateBegin) - DATEPART(DW,@DateEnd)) + 1
END
-
COUNT(*)
FROM cte_S
WHERE ([userId] = tblM.[userId])
AND ([mark] = 1)
) AS [旷工次数]
FROM [Sign] AS tblM

这个比较接近800个字符了,你再去掉些可有可无的关键字………
如果你可以再写一个函数的话,你可以把Case那段写在函数里。

这个有点复杂,建议你在表中加一个状态的列,用于存放当天是早退,迟到,还是正常上班,就像签卡那一列一样,这样写出来就简单了

我只能说很简单。

楼上的答案 很占屏幕


滦平县17242756117: 请高手赐教一个单表按条件查询sql语句
愚萍护肝:SELECT userid, RoleName=STUFF((SELECT '、'+RoleName FROM 表名 t WHERE userid=表名.userid FOR XML PATH('')), 1, 1, '') FROM 表名 GROUP BY userid

滦平县17242756117: 请SQL的高手帮忙看看查询语句该怎样写 -
愚萍护肝: 如果SQL的表结构和你上面的表格是一样的 那么可以这样写: select ryb.ryxm, (select bcmc from bcb where bcdm=pbb.z1), (select bcmc from bcb wh...

滦平县17242756117: 简单的SQL查询语句.高手帮下忙呀.谢谢咯!!! -
愚萍护肝: SELECT MAX(id) FROM 表 WHERE id < (SELECT MAX(id) FROM 表)

滦平县17242756117: 求sql查询语句
愚萍护肝: select * from (select count(*) from table) as all,(select count(*) from table where apple>=3) as big,(select count(*) from table where apple<3) as small where all.name=big.name and all.name=small.name group by name 每个查询后面+一个group by name

滦平县17242756117: sql简单查询语句. 求大神帮忙 -
愚萍护肝: select * from 表的名称 order by 姓氏的字段,名字的字段 desc;

滦平县17242756117: 一个很基础的SQL查询语句 -
愚萍护肝: 这个是SQLSERVER的查询 方括号在此处并不是必须的,方括号一般是用来括用户表中涉及的数据库的保留字的.比如USER, ID等等之类的SQLSERVER的保留字.因为数据库本身有这些关键字,而用户创建自己的表时,又创建了这些字段,...

滦平县17242756117: sql 查询 请高人帮忙 -
愚萍护肝: select top 2 * from 表1 order by id desc union all select top 2 * from 表2 order by id desc union all select top 2 * from 表3 order by id desc

滦平县17242756117: SQL查询语句,谢谢大家帮个忙,新手,非常感谢 -
愚萍护肝: 1) SELECT temp.Dept, sum(temp.pay) as 工资总额 FROM temp group by temp.Dept 2)select * from temp inner join (select temp.dept,avg(temp.pay) as pay from temp group by temp.dept) TA on temp.dept=TA.dept where temp.pay>TA.pay

滦平县17242756117: 求高手指点SQL查询语句 -
愚萍护肝: 先生成序号字段(根据时间字段的顺序),然后计算相临的差值select DateDiff(hh,t.时间字段,t1.时间字段) from (select rank() over (order by 时间字段) as 序号,时间字段 from table1) t,(s...

滦平县17242756117: sql查询语句? -
愚萍护肝: SELECT <列名列表> [,…n] FROOM <表名>功能:从指定表总选出指定的列 --重复,分组S...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网