我正在尝试生成已经完成旅行并且从不在客户端取消的独特司机的数量。如果驱动程序曾在任何客户端取消,则应将其从结果中删除。
我想知道这里是否需要子查询。 我正在使用的数据显示在这里,虽然不成熟,但它只是测试我的查询。
id driver_id client_id city_id status
1 1011 9004 546 completed
1 1011 9008 323 completed
2 1011 9001 546 completed
3 1011 9006 323 completed
3 1011 9007 154 cancelled_by_client
1 1012 9001 546 cancelled_by_client
2 1012 9003 123 cancelled_by_driver
2 1012 9002 789 completed
2 1013 9007 546 cancelled_by_driver
4 1013 9006 546 cancelled_by_driver
2 1015 9001 546 completed
3 1015 9006 323 completed
3 1015 9007 154 cancelled_by_client
我所追求的是因为我的预期结果是已完成旅行并且从未在客户端上取消的唯一驱动程序ID的计数(canceled_by_driver)。
driver_id non_driver_cancels
1011 1
1015 1
我在这里有一个GROUP BY来显示更详细的数据,我看到驱动程序1012有一个cancel_by_driver,但它们仍在我的结果中。从那里我相信我可以简单地计算driver_id并完成这项任务。
非常感谢任何帮助。
答案 0 :(得分:2)
您可以使用group by
和having
:
select driver_id, sum(status = 'cancelled_by_client') as client_cancels
from t
group by driver_id
having sum(status = 'cancelled_by_driver') = 0;
这假设唯一的其他类型的取消是“cancelled_by_client”,如您的数据所示。
答案 1 :(得分:0)
试试这个:
SELECT driver_id, COUNT( DISTINCT driver_id) as Non_Driver_Cancel
FROM Trip
WHERE status NOT IN (SELECT DISTINCT status FROM Trip WHERE status <> 'cancelled_by_driver')
GROUP BY driver_id;