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

求助SQL查询统计问题

qinyun 发布于 2011-03-03 01:16, 1070 次点击
成绩    时间
100    2011-3-2 17:40:00
100    2011-3-2 17:40:00
99    2011-3-2 17:41:00
99    2011-3-2 17:40:00
95    2011-3-1 17:40:00
75    2011-2-28 17:40:00
73    2011-2-28 17:40:00
70    2011-3-1 17:40:00
70    2011-2-28 17:40:00
60    2011-3-2 17:40:00
50    2011-3-1 17:40:00
6    2011-3-2 17:40:00
6    2011-3-3 0:30:00
3    2011-3-3 0:24:00

请问各位用SQL语句想得到以下结果应怎么写

日期        合格     不合格     合格率
2011-3-1      5          3        62.5%
2011-3-2      6          5        54.5%

我用以下语句怎么都得不到想要的结果,就是不知道错误出在哪里
SELECT CONVERT(VARCHAR(30), 时间, 111),
      COUNT(CASE WHEN cast(成绩 AS int) >= 90 THEN 1 ELSE 0 END) AS 合格,
      COUNT(CASE WHEN cast(成绩 AS int) < 90 THEN 1 ELSE 0 END) AS 不合格,
      COUNT(CASE WHEN cast(成绩 AS int) >= 90 THEN 1 ELSE 0 END)
      / COUNT(CASE WHEN cast(成绩 AS int) < 90 THEN 1 ELSE 0 END) * 100 AS 合格率
FROM mlks_data_backup
GROUP BY CONVERT(VARCHAR(30), 时间, 111)
3 回复
#2
png2011-03-03 23:14
--日期        合格     不合格     合格率
--2011-3-1      5          3        62.5%
--2011-3-2      6          5        54.5%
--
-- COUNT(CASE WHEN cast(成绩 AS int) >=90... 合格,

回答如何写SQL之前,需要先弄清你的数据与期望的结果间的因果关系.

为什么3月1号共8位?

为什么3月2号有6位合格的? 按照不小于90为合格计算,你所有数据里只有5位.是我没数清楚?
#3
aei1352011-03-04 22:38
SELECT CONVERT(VARCHAR(10), 时间, 120),
      COUNT(CASE WHEN cast(成绩 AS int) >= 90 THEN 1 ELSE 0 END) AS 合格,
      COUNT(CASE WHEN cast(成绩 AS int) < 90 THEN 1 ELSE 0 END) AS 不合格,
      CONVERT(VARCHAR(20),COUNT(CASE WHEN cast(成绩 AS int) >= 90 THEN 1 ELSE 0 END)*1.0/ COUNT(成绩) * 100)+'%' AS 合格率
FROM mlks_data_backup
GROUP BY CONVERT(VARCHAR(10), 时间, 120)
#4
jinanshui2011-03-07 05:55
太高了
1