我很好奇,这个结果集是否可以用sql查询实现?
这是表格
item_id name availability
-----------------------------------
1 brush available
2 brush available
3 paint not available
4 paint available
这是结果
name available not available
---------------------------------------
brush 2 0
paint 1 1
查询可能是什么样的?
答案 0 :(得分:9)
SELECT name,
COALESCE(SUM(CASE WHEN availability = 'available' THEN 1 ELSE 0 END), 0) AS available,
COALESCE(SUM(CASE WHEN availability = 'available' THEN 0 ELSE 1 END), 0) AS not_available
FROM mytable
GROUP BY
name
答案 1 :(得分:1)
如果不知道如何使用结果,可能值得考虑是否可以使用更简单,类似的查询。例如:
SELECT name, availability, COUNT(*) As CountOfAvailability
GROUP BY name, availability
将生成:
name availability CountOfAvailability
---------------------------------------------------
brush available 2
paint available 1
paint not available 1
这为您提供了一组很好的结果,这些结果可能在您的实现中可用(?)。
否则,您也可以将该查询/结果集用作基本视图(例如,将其称为vw_Base),然后执行此类操作(注意:完全未经测试):
SELECT DISTINCT
names.name,
available_results.CountOfAvailability As "available",
not_available_results.CountOfAvailability As "not available"
FROM
vw_Base
LEFT JOIN (SELECT CountOfAvailability FROM vw_Base WHERE availability = 'available') As available_results ON vw_Base.name = available_results.name
LEFT JOIN (SELECT CountOfAvailability FROM vw_Base WHERE availability = 'not available') As not_available_results ON vw_Base.name = not_available_results.name
并且,根据您使用的数据库系统,使用函数将返回的任何null结果转换为零(例如SQL Server中的ISNULL())。