我有表组,
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语句成为可能的是什么?
答案 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;