怎么写出下面这个结果的高效SQL语句?

ttllhh 2012-10-14 08:46:23
有如下表及其数据记录:

姓名 里程 结果
张三 1 合格
张三 3 合格
张三 2 不合格
张三 1.5 合格
张三 2 不合格


希望输出结果:

姓名 里程合计 合格数 不合格数
张三 7.5 3 2

我目前的sql写法如下,但我认为这种方法太低效,有没高效的方法可实现上面的输出效果??谢谢

select 姓名,里程合计,合格数,不合格数 from(
select 姓名,sum(里程) as 里程合计 from tab group by 姓名) as a
full join
(select 姓名,count(结果) as 合格数 from tab where 结果='合格' group by 姓名) as b on a.姓名=b.姓名
full join
(select 姓名,count(结果) as 不合格数 from tab where 结果='不合格' group by 姓名) as c on a.姓名=c.姓名
...全文
53 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2012-10-14
  • 打赏
  • 举报
回复
如果你只要合计合格的历程,就用这个:
/*CREATE TABLE test (姓名 VARCHAR(10), 里程 DECIMAL(4,2), 结果 varchar(10))
INSERT INTO test
SELECT '张三', 1, '合格'
UNION ALL
SELECT '张三', 3, '合格'
UNION ALL
SELECT '张三', 2 , '不合格'
UNION ALL
SELECT '张三', 1.5, '合格'
UNION ALL
SELECT '张三', 2 , '不合格'
*/

SELECT 姓名,SUM(CASE WHEN 结果='合格' THEN 里程 ELSE 0 END) 里程,合格数=COUNT (CASE WHEN 结果='合格' THEN 1 ELSE null END) ,不合格数=COUNT (CASE WHEN 结果='不合格' THEN 1 ELSE null END )
FROM test
GROUP BY 姓名
/*
姓名 里程 合格数 不合格数
---------- --------------------------------------- ----------- -----------
张三 5.50 3 2
警告: 聚合或其他 SET 操作消除了 Null 值。

(1 行受影响)
*/
發糞塗牆 2012-10-14
  • 打赏
  • 举报
回复
我不知道你那个7.5是怎么算出来的
/*CREATE TABLE test (姓名 VARCHAR(10), 里程 DECIMAL(4,2), 结果 varchar(10))
INSERT INTO test
SELECT '张三', 1, '合格'
UNION ALL
SELECT '张三', 3, '合格'
UNION ALL
SELECT '张三', 2 , '不合格'
UNION ALL
SELECT '张三', 1.5, '合格'
UNION ALL
SELECT '张三', 2 , '不合格'
*/

SELECT 姓名,SUM(里程) 里程,合格数=COUNT (CASE WHEN 结果='合格' THEN 1 ELSE null END) ,不合格数=COUNT (CASE WHEN 结果='不合格' THEN 1 ELSE null END )
FROM test
GROUP BY 姓名
/*
姓名 里程 合格数 不合格数
---------- --------------------------------------- ----------- -----------
张三 9.50 3 2
警告: 聚合或其他 SET 操作消除了 Null 值。

(1 行受影响)
*/

34,588

社区成员

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

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