Вопрос:
У меня есть таблица, и мне нужно представить результат следующим образом.
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
Может ли кто-нибудь помочь мне настроить запрос для достижения результата.
Примечание. Я не могу добавить сумму, окружающую это. Его часть более крупной программы и поэтому я не могу добавить супер-запрос к этому.
Лучший ответ: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
Вы можете увидеть результат для этого запроса ЗДЕСЬ
Ответ №1
Закрыть… 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 Ответ №2
В зависимости от вашего вида 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 возвращает сумму уникальных значений.
Ответ №3
Причина, по которой вы получаете две строки вместо одной, состоит в том, что вы группируете rsp_ind во внешнем запросе (которого вы не сделали, к моему разочарованию, поделитесь с нами). Нет ничего, что можно сделать, чтобы заставить одну строку вместо двух, не имея дело с этим элементом GROUP BY.
Ответ №4select 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 Ответ №5
Если вы хотите сгруппировать результаты на основе столбца и рассчитать их на основе того же числа, вы можете выполнить запрос как
$ 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 “;
Ответ №6select sum(rsp_ind = 0) as `New`, sum(rsp_ind = 1) as `Accepted` from tb_a Ответ №7
Хорошо. Я решил это
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