SQL Count非现有项目

时间:2013-12-18 10:29:50

标签: sql postgresql select count left-join

我有表组,

ID  NUMBER
STATUS  VARCHAR2(20 BYTE)

我可以将状态数计算如下。

select g.status, count(*) from groups g group by g.status;

STATUS                 COUNT(*)
-------------------- ----------
OK                            2 
NOK                           1 

我有另一种身份,比如PENDING,REJECTED。但是表格中没有任何项目,但我希望它们显示为零计数,如下所示。

STATUS                 COUNT(*)
-------------------- ----------
OK                            2 
NOK                           1 
PENDING                       0 
REJECTED                      0 

使SQL语句成为可能的是什么?

4 个答案:

答案 0 :(得分:5)

试试这个

SELECT A.status, COUNT(DISTINCT G.ID) statusCnt
FROM (SELECT 'OK' status FROM DUAL
      UNION 
      SELECT 'NOK' status FROM DUAL
      UNION 
      SELECT 'PENDING' status FROM DUAL
      UNION 
      SELECT 'REJECTED' status FROM DUAL
     ) AS A 
LEFT JOIN groups G ON A.status = G.STATUS 
GROUP BY A.status;

答案 1 :(得分:2)

如果存在一个包含状态列表的表,您可以用这种方式编写查询:

我想你的州登记处已经打电话给STATES

SELECT
    states.status,
    (select count(*) from groups g where g.status = states.status)
FROM states

可替换地:

SELECT
    s.status, count(*)
FROM states s
LEFT OUTER JOIN groups g
    ON s.status = g.status
GROUP BY s.status

否则您无法获取此信息

编辑(评论后)

请创建一个表格:

CREATE TABLE states
(id int,
status varchar(20))

在表中,GROUPS将状态字段替换为fk到状态表

答案 2 :(得分:1)

我认为结果的LEFT OUTER JOIN将是一个简单而快速的解决方案。

与其他答案一样,假设您有一个“状态”表列出了所需的“状态”,您可以使用“分组依据”结果加入“状态”表,并将NULL值填充为0。

SELECT s.status,COALESCE(gs.numGroups,0)
FROM states AS s
LEFT OUTER JOIN
  (SELECT status,count(*) AS numGroups FROM groups AS g GROUP BY status) AS gs
  ON gs.status=states.status

结果看起来像这样(在SQLite中测试):

status            numGroups
---------------------------
OK                2
NOK               1
PENDING           0
REJECTED          0

请注意,COALESCE函数可能在其他数据库中以不同方式调用,例如SQLite中的IFNULL,或SQL服务器中的ISNULL

答案 3 :(得分:-1)

试试这个

select g.status, ISNULL(COUNT(*),0) from groups g group by g.status;