SQL在列中选择聚合值

时间:2009-12-29 12:17:28

标签: sql select

我很好奇,这个结果集是否可以用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

查询可能是什么样的?

2 个答案:

答案 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())。