Mysql 如何获取列计数

Mysql 如何获取列计数,mysql,sql,postgresql,Mysql,Sql,Postgresql,我有一个问题如下 select project_task_id, status_id, sum(case when StatusID=1 then 1 else 0 end) as task_id=1, sum(case whenStatusID=2 then 1 else 0 end) as task_id=2, sum(case when StatusID=3 then 1 else 0 end) as task_id=3,

我有一个问题如下

select project_task_id,
       status_id,
       sum(case when StatusID=1 then 1 else 0 end) as task_id=1,
       sum(case whenStatusID=2 then 1 else 0 end) as task_id=2,
       sum(case when StatusID=3 then 1 else 0 end) as task_id=3,
       sum(case when StatusID=4 then 1 else 0 end) as task_id=4,
       sum(case when StatusID=5 then 1 else 0 end) as task_id=5,
       sum(case when StatusID=6 then 1 else 0 end) as task_id=6,
       sum(case when StatusID=7 then 1 else 0 end) as task_id=7,
from"Projects".work_unit_status 
group by project_task_id,status_id;
我将获得以下附加输出:

我希望得到以下预期输出:

如果状态标识为空,则包括零
请选择任何有关此的帮助

尝试以下方法:使用“全部总和”列的加法

 select project_task_id,status_id,
isnull(sum(case when StatusID=1 then 1 else 0 end),0)+
isnull(sum(case whenStatusID=2 then 1 else 0 end),0) +
isnullsum(case when StatusID=3 then 1 else 0 end),0) +
isnullsum(case when StatusID=4 then 1 else 0 end),0)+
isnullsum(case when StatusID=5 then 1 else 0 end),0) +
isnullsum(case when StatusID=6 then 1 else 0 end),0) +
isnullsum(case when StatusID=7 then 1 else 0 end),0) as count_status
from"Projects".work_unit_status group by project_task_id,status_id

在您的案例中使用中的

with t1 as (
 select project_task_id,
           status_id,
           sum(case when StatusID in (1,2,3,4,5,6,7) then 1 else 0) 
           as sum_s               
    from "Projects".work_unit_status

    group by project_task_id,status_id
              ) ,
           t2 as
             (
                 select * from (
                 select 1 as statusid 
                          union
                 select 2
                 union 
                 select 3
                 union
                 select 4 
                 union
                 select 5 
                 union
                 select 6
                  union
                select 7 ) t
             ) select t1.project_task_id,
                   t2.statusid,
                    case when t1.sum_s>0 or not null
                    then sum_s else 0 end as total
                  t2 full join t1 on t2.statusid=t1.status_id

在不知道确切的表结构的情况下,我假设status_id和statusId引用同一列。(如果它们是不同的列,我们需要在计数中使用StatusId。)

根据预期的输出,您需要计算状态\u id和按项目\u任务\u id分组。为了确保每个任务的每个状态都表示出来,首先,我们需要创建一个包含所有可能的项目\u任务\u id/状态\u id组合的子查询。然后我们将其与原始表的聚合值一起使用

select
  ps.project_task_id,
  ps.status_id,
  count(w.status_id) as total
from (
  select distinct
      project_task_id,
      s.status_id
  from work_unit_status
  cross join (select distinct status_id from work_unit_status) s
  ) ps
left join work_unit_status w
    on ps.project_task_id = w.project_task_id and ps.status_id = w.status_id 
group by
    ps.project_task_id,
    ps.status_id
如果您确实需要硬编码从1到7的状态,请使用下面的查询

select
  ps.project_task_id,
  ps.status_id,
  count(w.status_id) as total
from (
  select distinct
      project_task_id,
      s.status_id
  from work_unit_status
    cross join (
          select 1 as status_id
    union select 2
    union select 3
    union select 4
    union select 5
    union select 6
    union select 7
    ) s
  ) ps
left join work_unit_status w
  on ps.project_task_id = w.project_task_id and ps.status_id = w.status_id 
group by
  ps.project_task_id,
  ps.status_id
order by
  ps.project_task_id,
  ps.status_id

如果字段为空,则需要包含零。当字段为空时,将自动忽略该字段。为什么需要0?错误:函数isnull(bigint,integer)不存在第6行:isnull(sum(状态为1,则为1,否则为0),0)+^提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。********错误*********错误:函数isnull(bigint,integer)不存在SQL状态:42883提示:没有与给定名称和参数类型匹配的函数。您可能需要添加显式类型转换。字符:45运行时出现上述错误我只想显示这样的输出请帮助我检查您是否使用MySQL或Postgresql?这里的大多数人希望示例数据为格式化文本,不是图像。如果statusid为空,如何包含零,请帮助me@narsimha当statusid为null时,使用另一种情况0@narsimha检查我编辑的答案顺便问一下,您希望如何显示空白状态ID?您想要这些或其他的总和吗?如果statusid为空,例如project_task_id为4,则我希望包含“0”(零)。只有状态id为2。剩余的我希望显示为0@narsimha是否可以添加示例表数据需要包含状态\u id“1到7”如果状态\u id为空需要获取总计0是否尝试过?当状态id为空时,它返回0。如果您的status_id在表中根本不存在,那么它将不可见。在这种情况下,最简单的方法是将您的表与status表(其中status_id是主键)连接起来。