mysql-按不存在的值分组
是否可以按“不存在”分组(如果这不是正确的术语,请抱歉) 例如,如果我有一个表,例如: post_id-状态 1-主动 2-暂停 3-暂停 状态表的可能值为:活动、暂停、保持、删除 但是status列在任何给定时间都可能有或可能没有所有这些状态类型,但是我仍然希望返回一个计数为0的状态,即使它不在其中 是否可以执行以下操作(伪查询): 按状态从用户组中选择计数(post_id)、状态(活动、暂停、保留、删除)mysql-按不存在的值分组,mysql,sql,properties,group-by,Mysql,Sql,Properties,Group By,是否可以按“不存在”分组(如果这不是正确的术语,请抱歉) 例如,如果我有一个表,例如: post_id-状态 1-主动 2-暂停 3-暂停 状态表的可能值为:活动、暂停、保持、删除 但是status列在任何给定时间都可能有或可能没有所有这些状态类型,但是我仍然希望返回一个计数为0的状态,即使它不在其中 是否可以执行以下操作(伪查询): 按状态从用户组中选择计数(post_id)、状态(活动、暂停、保留、删除) 注意:在任何人建议不这样做之前,我没有选择,因为这是这个CMS的属性表的结构。Tryc
注意:在任何人建议不这样做之前,我没有选择,因为这是这个CMS的属性表的结构。Try
case
语句
SELECT SUM(CASE WHEN status = "active" THEN 1 ELSE 0 END) active_count,
SUM(CASE WHEN status = "suspended" THEN 1 ELSE 0 END) suspended_count,
SUM(CASE WHEN status = "hold" THEN 1 ELSE 0 END) hold_count,
SUM(CASE WHEN status = "deleted" THEN 1 ELSE 0 END) deleted_count
FROM posts;
还有这个
SELECT "active", SUM(CASE WHEN status = "active" THEN 1 ELSE 0 END) active_count
FROM posts
UNION
SELECT "suspended", SUM(CASE WHEN status = "suspended" THEN 1 ELSE 0 END) suspended_count
FROM posts
UNION
SELECT "hold", SUM(CASE WHEN status = "hold" THEN 1 ELSE 0 END) hold_count
FROM posts
UNION
SELECT "deleted", SUM(CASE WHEN status = "deleted" THEN 1 ELSE 0 END) deleted_count
FROM posts
更好
SELECT "active", COUNT(*) active_count
FROM posts WHERE status = "active"
UNION
SELECT "suspended", COUNT(*) suspended_count
FROM posts WHERE status = "suspended"
UNION
SELECT "hold", COUNT(*) hold_count
FROM posts WHERE status = "hold"
UNION
SELECT "deleted", COUNT(*) deleted_count
FROM posts WHERE status = "deleted"
请参阅SQL FIDLETry
case
语句
SELECT SUM(CASE WHEN status = "active" THEN 1 ELSE 0 END) active_count,
SUM(CASE WHEN status = "suspended" THEN 1 ELSE 0 END) suspended_count,
SUM(CASE WHEN status = "hold" THEN 1 ELSE 0 END) hold_count,
SUM(CASE WHEN status = "deleted" THEN 1 ELSE 0 END) deleted_count
FROM posts;
还有这个
SELECT "active", SUM(CASE WHEN status = "active" THEN 1 ELSE 0 END) active_count
FROM posts
UNION
SELECT "suspended", SUM(CASE WHEN status = "suspended" THEN 1 ELSE 0 END) suspended_count
FROM posts
UNION
SELECT "hold", SUM(CASE WHEN status = "hold" THEN 1 ELSE 0 END) hold_count
FROM posts
UNION
SELECT "deleted", SUM(CASE WHEN status = "deleted" THEN 1 ELSE 0 END) deleted_count
FROM posts
更好
SELECT "active", COUNT(*) active_count
FROM posts WHERE status = "active"
UNION
SELECT "suspended", COUNT(*) suspended_count
FROM posts WHERE status = "suspended"
UNION
SELECT "hold", COUNT(*) hold_count
FROM posts WHERE status = "hold"
UNION
SELECT "deleted", COUNT(*) deleted_count
FROM posts WHERE status = "deleted"
请参见SQL fiddle,我的查询与Oracle相同。下面我们来做这项工作
select * from (
select status from users
)
pivot (
count(status) as count
for status in ('active' as A, 'suspended' as S, 'hold' as H, 'deleted' as D)
);
信用证:我的查询与Oracle相同。下面我们来做这项工作
select * from (
select status from users
)
pivot (
count(status) as count
for status in ('active' as A, 'suspended' as S, 'hold' as H, 'deleted' as D)
);
积分:您可以使用合成数据对查询结果进行连接。例如,
选择coalesce(r.count,0)作为count,s.status from statuses as s left join{that query}作为r on s.status=r.status
,其中statuses包含分组的已知状态集。我该怎么做?你能用几行样本数据和所需的输出来说明你的问题吗。也许只是我,但我很难理解你真正想要的是什么。同上@peterm,abd为什么你要从用户表中选择?当然,这将是posts表。是否要按用户分组?请详细说明。不管表名是什么,这是一个包含简单数据的假表,用于简化问题,并使用合成数据连接查询结果。例如,选择coalesce(r.count,0)作为count,s.status from statuses as s left join{that query}作为r on s.status=r.status
,其中statuses包含分组的已知状态集。我该怎么做?你能用几行样本数据和所需的输出来说明你的问题吗。也许只是我,但我很难理解你真正想要的是什么。同上@peterm,abd为什么你要从用户表中选择?当然,这将是posts表。是否要按用户分组?请详细说明。不管表名是什么,这是一个带有简单数据的假表,以简化问题