SQL-запрос с группировкой возможных значений и выводом пустых строк, если счетчик равен нулю?

Допустим, я менеджер универмага, и мне нужно подсчитать продажи в разных магазинах A.B.C и D.

код что-то вроде

select   
"Sales" as V1,
count(distinct case when XXX) as V1,
count(distinct case when XXX) as V2,
count(distinct case when XXX) as V3,


from sales_data
group by store;

но в текущем наборе данных о продажах пока есть только данные для магазина A и B, и выходные данные выше будут содержать только строку для магазина A и B, но не C и D. как мне сделать вывод пустой строкой для «магазина» «даже если его нет в наборе данных, поэтому он всегда выводится для каждого магазина?

Отделение ИДЕНТИФИКАТОР Распродажа А 01 5 А 01 4 Б 02 2 А 03 3

поэтому я хочу объем продаж по отделам

Отделение Общий А 12 Б 2 С 0

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

Спасибо

я знаю, что это, вероятно, довольно просто, но я попробовал погуглить и ничего не нашел

Не могли бы вы добавить некоторые простые данные и ожидаемый результат? также отметьте используемую вами СУБД

SelVazi 20.05.2024 11:17

@SelVazi Dept, ID, продажа A,01,5 A,01,4 B,02,2 A,03,3, поэтому я хочу получить объем продаж по отделам, Total A,12 B,2 C,0

KevinC 20.05.2024 11:27

Какую СУБД (mysql, sql-сервер...) вы используете?

SelVazi 20.05.2024 11:47

Ваш оператор выбора и вывод не совпадают. Кажется, что вы хотите, чтобы названия отделов были заголовками столбцов, но в выводе они отображаются в виде строк. Не могли бы вы уточнить, хотите ли вы объединить строки в столбцы? Кроме того, какую СУБД вы используете? Если вы используете SQL Server, посмотрите этот пример сводного запроса: dbfiddle.uk/p5TwaxO0. Этот скрипт динамически создает сводную таблицу для отображения данных о продажах для каждого отдела.

Senthil P Nathan 20.05.2024 12:35

Базовое решение заключается в том, что вам нужен список всех ваших отделов, независимо от того, есть ли у них продажи. В идеале эта информация должна храниться в таблице, но вы можете сгенерировать ее как часть вашего запроса (как это сделал @SelVazi в своем ответе) - хотя это означает, что вам придется изменять свой запрос всякий раз, когда список отделов изменится.

NickW 20.05.2024 13:01

У вас есть отдельный стол Departments?

Charlieface 20.05.2024 13:26
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
6
80
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам следует использовать функцию SUM() вместо COUNT():

SELECT t.Department,
       COALESCE(SUM(Sale), 0) as Total
FROM (
  SELECT 'A' AS Department 
  UNION ALL SELECT 'B'
  UNION ALL SELECT 'C'
) AS t -- Replace this subquery with the select of all departments
LEFT JOIN sales_data s ON s.Department = t.Department
GROUP BY t.Department

Демо на MySQL

В ФП не указан источник отделов. Подзапрос можно заменить выбором всех отделов из таблицы, если она существует.

SelVazi 20.05.2024 12:07

Я бы порекомендовал иметь отдельный набор данных, который определяет все ожидаемые вами отделы. Затем вы можете присоединиться к нему слева. Это гарантирует, что у вас всегда будут данные по всем магазинам. Например:

/* Pretend this is a permanent dataset or in a database */
data departments;
    input department$;
    datalines;
A
B
C
;
run;

proc sql;
    create table want as
        select t1.department
             , CASE(sum(sale))
                   when . then 0  
                   else sum(sale)
               END as total
        from departments as t1
        LEFT JOIN
             have as t2
        ON t1.department = t2.department
        group by t1.department
    ;
quit;
department  total
A           12
B           2
C           0

Да, это правда, если вы поменяете местами наборы данных для t1 и t2 и оставите соединение, вы получите тот же ответ.

Stu Sztukowski 20.05.2024 13:44
Ответ принят как подходящий

Если вы не можете предположить, что ваши данные будут полностью охватывать отделы, вам понадобится отдельный набор данных, перечисляющий полный список.

data departments_all ;
  input department$ @@ ; datalines;
A B C
;
data have ;
input department$ id$ sale ; datalines ;
A   01  5
A   01  4
B   02  2
A   03  3
;
proc sql ;
  create table want as
  select all.department, coalesce(sum(sale),0) as total, count(distinct id) as distinct_id_count
  from departments_all as all
  left join have on all.department = have.department
  group all.department 
  ;

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

Похожие вопросы

Как создать отдельные диапазоны дат из набора диапазонов в sql
Выберите уникальный второй столбец для каждого первого столбца с минимальным значением третьего столбца
Снежинка SQL | Как суммировать различные значения за один проход?
Как фильтровать идентификаторы, где значение другого столбца одинаково для всех строк?
SQL – множественное ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
У меня есть запрос на создание последовательности дат на основе заданной даты начала. Я хочу выполнить тот же запрос для всех остальных дат и объединить результаты
Восстановите данные из таблицы, воссозданной несколько раз в снежинке
SQL-соединение, отображение нескольких значений в одной строке
Обход дерева с самым длинным путем и несколькими ветвями в реалистичные сроки
Как написать SQL-запрос, который будет выводить валюту каждого первого числа каждого месяца в 2024 году?