как узнать количество столбцов - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть запрос, подобный приведенному ниже

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;

Я получаю следующий прикрепленный вывод:

https://i.stack.imgur.com/1wfD1.png

, и я хочу получить ожидаемое нижевывод:

https://i.stack.imgur.com/Zql9z.png

включает нули, если значение status_id пусто, пожалуйста, любая помощь по этому

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

используйте in с вашим делом

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
0 голосов
/ 19 сентября 2018

Не зная точной структуры таблицы, я предположил, что status_id и statusId ссылаются на один и тот же столбец.(Если это разные столбцы, нам нужно использовать StatusId в COUNT.)

Исходя из ожидаемого результата, вы хотите посчитать status_id и сгруппировать по project_task_id.Чтобы убедиться, что каждый статус представлен для каждой задачи, сначала нам нужно создать подзапрос всех возможных комбинаций project_task_id / status_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 голосов
/ 19 сентября 2018

Попробуйте: используйте добавление столбца всей суммы

 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...