Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 我需要使用COUNT()函数将表中不存在的数据选择为零,如何使用Sql执行此操作_Mysql_Sql - Fatal编程技术网

Mysql 我需要使用COUNT()函数将表中不存在的数据选择为零,如何使用Sql执行此操作

Mysql 我需要使用COUNT()函数将表中不存在的数据选择为零,如何使用Sql执行此操作,mysql,sql,Mysql,Sql,例如: 选择COUNTnum作为编号、状态 从基地 状态在“P”、“J”、“K”中的位置 按身份分组; 注意:状态列中不存在J和K,但我需要将数字显示为零 结果应该是: number | Status --------------- 1500 | P 0 | J 0 | K 您可以使用派生表和左联接: 如果您不介意将结果作为列而不是行,那么我们可以在此处尝试使用条件聚合: SELECT COUNT(CASE WHEN Status = 'P' THEN 1 EN

例如:

选择COUNTnum作为编号、状态 从基地 状态在“P”、“J”、“K”中的位置 按身份分组; 注意:状态列中不存在J和K,但我需要将数字显示为零

结果应该是:

number | Status
---------------
1500   | P
0      | J
0      | K

您可以使用派生表和左联接:


如果您不介意将结果作为列而不是行,那么我们可以在此处尝试使用条件聚合:

SELECT
    COUNT(CASE WHEN Status = 'P' THEN 1 END) AS p_cnt,
    COUNT(CASE WHEN Status = 'J' THEN 1 END) AS j_cnt,
    COUNT(CASE WHEN Status = 'K' THEN 1 END) AS k_cnt
FROM base;
@Lukasz建议的派生表思想是一个很好的想法,在任何情况下,您都应该为stati设置一个单独的表。

您可以使用UNION ALL as轻松取消数据的IVOT


如果将来插入的某些行的状态为“J”或“K”且num>0,则这些行的计数值也将大于零。

您可能要做的是修复数据模型,以便有一个状态参考表:

create tables statuses (
    status char(1) primary key,
    description varchar(255),
    createdAt datetime default curent_datetime
);
您可能还需要存储其他信息

填充此表:

insert into statuses (status, description)
    values ('P', 'P status'),
           ('J', 'J status'),
           ('K', 'K status');
你可能会找到更好的描述

声明正确的外键关系:

alter table base add constraint fk_base_status foreign key (status) references statuses(status);
然后使用左连接:


你应该使用UNION ALL,而不是UNION。@BarbarosÖzhan很可能是因为UNION ALL(不关心删除重复项)比UNION(需要做额外工作)表现更好。@TimBiegeleisen哦,对不起,我误读为UNION ALL或UNION,但这给出了旋转结果,而OP想要取消激活。
insert into statuses (status, description)
    values ('P', 'P status'),
           ('J', 'J status'),
           ('K', 'K status');
alter table base add constraint fk_base_status foreign key (status) references statuses(status);
select s.status, count(b.status)
from statuses s left join
     base b
     on s.status = b.status
group by s.status;