Как получить количество столбцов

у меня есть запрос, как показано ниже

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 пуст пожалуйста, помогите в этом

Вы используете MySQL или Postgresql?

jarlh 19.09.2018 09:32

Большинству людей здесь нужны образцы данных в виде форматированного текста, а не изображений.

jarlh 19.09.2018 09:32
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
88
3

Ответы 3

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

 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

необходимо указать ноль, если поле пустое

Nikolas 19.09.2018 09:31

когда поле пустое, оно автоматически игнорируется. зачем тебе тогда 0?

Fahmi 19.09.2018 09:32

ОШИБКА: функция isnull (bigint, integer) не существует. СТРОКА 6: isnull (сумма (если status_id = 1, затем 1 else 0 end), 0) + ^ СОВЕТ: ни одна функция не соответствует заданному имени и типам аргументов. Возможно, вам потребуется добавить явное приведение типов. ********** Ошибка ********** ОШИБКА: функция isnull (bigint, integer) не существует Состояние SQL: 42883 Подсказка: ни одна функция не соответствует заданному имени и типам аргументов. Возможно, вам потребуется добавить явное приведение типов. Персонаж: 45 появляется выше ошибка во время бега

Nikolas 19.09.2018 10:46

Я хочу отображать такой вывод, только пожалуйста, помогите мне

Nikolas 19.09.2018 11:03

используйте 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

как включить нули, если statusid пуст, пожалуйста, помогите мне

Nikolas 19.09.2018 10:41

@narsimha использовать другой случай, когда statusid равен нулю, а затем 0

Zaynul Abadin Tuhin 19.09.2018 10:43

@narsimha проверьте, я отредактировал ответ, кстати, как вы хотите показать пустой statusid? ты хочешь получить сумму тех или иных

Zaynul Abadin Tuhin 19.09.2018 10:45

Я хочу включить '0' (ноль), если пустое значение statusid, например, для project_task_id равно 4, имеет только идентификатор статуса 2. остающийся я хочу отображать как 0

Nikolas 19.09.2018 10:50

@narsimha, не могли бы вы добавить данные из вашей таблицы

Zaynul Abadin Tuhin 19.09.2018 10:57

Я хочу включить '0' (ноль), если пустое поле statusid, например, для project_task_id равно 4, имеет только идентификатор статуса 2. остающийся я хочу отображать как 0 «i.stack.imgur.com/Zql9z.png», пожалуйста, откройте это ясно видимое спасибо заранее

Nikolas 19.09.2018 10:57

@narsimha, теперь я меняю свой запрос, и, кстати, он будет работать для вас от 1 до 7 statusid

Zaynul Abadin Tuhin 19.09.2018 11:06

пожалуйста, позвольте мне теперь получить ошибку ниже "ОШИБКА: синтаксическая ошибка в или около" t2 "СТРОКА 30: t2 left join cte на t2.status_id = t1.status_id ^ ********** Ошибка **** ****** ОШИБКА: синтаксическая ошибка в состоянии «t2» или рядом с ним: 42601 Символ: 698 рядом ....... случай, когда cte.sum_s> 0, затем sum_s else 0 заканчивается как общее t2 left join cte on t2.status_id = t1.status_id

Nikolas 19.09.2018 11:19

@i снова отредактировал ответ, но это сложно, поскольку вы не делитесь своими данными таблицы, но, похоже, мой запрос в порядке

Zaynul Abadin Tuhin 19.09.2018 11:45

Не зная точной структуры таблицы, я предположил, что 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

необходимо включить status_id "от 1 до 7", если status_id не заполнен, необходимо получить всего 0

Nikolas 19.09.2018 11:36

Ты пробовал это? Он возвращает 0, когда status_id пуст. Если у вас есть status_id, которого вообще нет в вашей таблице, он не будет виден. В этом случае самый простой способ - объединить вашу таблицу с таблицей статуса (где status_id является первичным ключом).

Miklos Karpati 19.09.2018 11:41

Другие вопросы по теме