Подтвердить что ты не робот

Использование sql count в case case

У меня есть таблица, и мне нужно представить результат следующим образом.

tb_a:

col1  |  reg_id | rsp_ind 

Количество строк с rsp_ind = 0 как "Новое" и 1 как "Принято"

Выход должен быть

NEW | Accepted
9   | 10

Я попытался использовать следующий запрос.

select 
  case when rsp_ind = 0 then count(reg_id)end as 'New',
  case when rsp_ind = 1 then count(reg_id)end as 'Accepted'
from tb_a

и я получаю вывод как

NEW | Accepted
NULL| 10
9   | NULL

Может ли кто-нибудь помочь мне настроить запрос для достижения результата. Примечание. Я не могу добавить сумму, окружающую это. Его часть более крупной программы и поэтому я не могу добавить супер-запрос к этому.

4b9b3361

Ответ 1

SELECT 
    COUNT(CASE WHEN rsp_ind = 0 then 1 ELSE NULL END) as "New",
    COUNT(CASE WHEN rsp_ind = 1 then 1 ELSE NULL END) as "Accepted"
from tb_a

Вы можете увидеть результат для этого запроса ЗДЕСЬ

Ответ 2

Закрыть... try:

select 
   Sum(case when rsp_ind = 0 then 1 Else 0 End) as 'New',
   Sum(case when rsp_ind = 1 then 1 else 0 end) as 'Accepted'
from tb_a

Ответ 3

В зависимости от вашего вида SQL, вы также можете использовать оператор else в ваших совокупных значениях.

Например, вот простая таблица Grades:

| Letters |
|---------|
| A       |
| A       |
| B       |
| C       |

Мы можем проверить каждый синтаксис совокупного счетчика следующим образом ( Интерактивная демонстрация в SQL Fiddle):

SELECT
    COUNT(CASE WHEN Letter = 'A' THEN 1 END)           AS [Count - End],
    COUNT(CASE WHEN Letter = 'A' THEN 1 ELSE NULL END) AS [Count - Else Null],
    COUNT(CASE WHEN Letter = 'A' THEN 1 ELSE 0 END)    AS [Count - Else Zero],
    SUM(CASE WHEN Letter = 'A' THEN 1 END)             AS [Sum - End],
    SUM(CASE WHEN Letter = 'A' THEN 1 ELSE NULL END)   AS [Sum - Else Null],
    SUM(CASE WHEN Letter = 'A' THEN 1 ELSE 0 END)      AS [Sum - Else Zero]
FROM Grades

И вот результаты (не имеющие отношения к читабельности):

|    Description    | Counts |
|-------------------|--------|
| Count - End       |    2   |
| Count - Else Null |    2   |
| Count - Else Zero |    4   | *Note: Will include count of zero values
| Sum - End         |    2   |
| Sum - Else Null   |    2   |
| Sum - Else Zero   |    2   |

Что совпадает с документами для агрегированных функций в SQL

Документы для COUNT:

COUNT(*) - возвращает количество элементов в группе. Это включает в себя значения NULL и дубликаты.
COUNT(ALL expression) - вычисляет выражение для каждой строки в группе и возвращает количество ненулевых значений.
COUNT(DISTINCT expression) - вычисляет выражение для каждой строки в группе и возвращает количество уникальных ненулевых значений.

Документы для SUM:

ALL - применяет статистическую функцию ко всем значениям. ВСЕ по умолчанию.
DISTINCT - указывает, что SUM возвращает сумму уникальных значений.

Ответ 4

Причина, по которой вы получаете две строки вместо одной, состоит в том, что вы группируете rsp_ind во внешнем запросе (которого вы не сделали, к моему разочарованию, поделитесь с нами). Нет ничего, что можно сделать, чтобы заставить одну строку вместо двух, не имея дело с этим элементом GROUP BY.

Ответ 5

select 
   Sum(case when rsp_ind = 0 then 1 Else 0 End) as 'New',
   Sum(case when rsp_ind = 1 then 1 else 0 end) as 'Accepted'
from tb_a

Ответ 6

Если вы хотите сгруппировать результаты на основе столбца и рассчитать их на основе того же числа, вы можете выполнить запрос как

$ sql = "SELECT COLUMNNAME,

COUNT(CASE WHEN COLUMNNAME IN ('YOURCONDITION') then 1 ELSE NULL END) as 'New',

COUNT(CASE WHEN COLUMNNAME IN ('YOURCONDITION') then 1 ELSE NULL END) as 'ACCPTED',

от TABLENAME

GROUP BY COLUMNANME ";

Ответ 7

select sum(rsp_ind = 0) as `New`,
       sum(rsp_ind = 1) as `Accepted` 
from tb_a

Ответ 8

Хорошо. Я решил это

SELECT 'smart_projects'.project_id, 'smart_projects'.business_id, 'smart_projects'.title,
 'page_pages'.'funnel_id' as 'funnel_id', count(distinct(page_pages.page_id) )as page_count, count(distinct (CASE WHEN page_pages.funnel_id != 0 then  page_pages.funnel_id ELSE NULL END ) ) as funnel_count
FROM 'smart_projects'
LEFT JOIN 'page_pages' ON 'smart_projects'.'project_id' = 'page_pages'.'project_id'
WHERE  smart_projects.status !=  0 
AND 'smart_projects'.'business_id' = 'cd9412774edb11e9'
GROUP BY 'smart_projects'.'project_id'
ORDER BY 'title' DESC