Допустим, я менеджер универмага, и мне нужно подсчитать продажи в разных магазинах 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. как мне сделать вывод пустой строкой для «магазина» «даже если его нет в наборе данных, поэтому он всегда выводится для каждого магазина?
поэтому я хочу объем продаж по отделам
я хочу выполнить другой запрос, сгруппированный по отделу, но я хочу, чтобы выходные данные запроса учитывали каждый отдел, даже если нет данных, подобных приведенным выше.
Спасибо
я знаю, что это, вероятно, довольно просто, но я попробовал погуглить и ничего не нашел
@SelVazi Dept, ID, продажа A,01,5 A,01,4 B,02,2 A,03,3, поэтому я хочу получить объем продаж по отделам, Total A,12 B,2 C,0
Какую СУБД (mysql, sql-сервер...) вы используете?
Ваш оператор выбора и вывод не совпадают. Кажется, что вы хотите, чтобы названия отделов были заголовками столбцов, но в выводе они отображаются в виде строк. Не могли бы вы уточнить, хотите ли вы объединить строки в столбцы? Кроме того, какую СУБД вы используете? Если вы используете SQL Server, посмотрите этот пример сводного запроса: dbfiddle.uk/p5TwaxO0. Этот скрипт динамически создает сводную таблицу для отображения данных о продажах для каждого отдела.
Базовое решение заключается в том, что вам нужен список всех ваших отделов, независимо от того, есть ли у них продажи. В идеале эта информация должна храниться в таблице, но вы можете сгенерировать ее как часть вашего запроса (как это сделал @SelVazi в своем ответе) - хотя это означает, что вам придется изменять свой запрос всякий раз, когда список отделов изменится.
У вас есть отдельный стол Departments?


Вам следует использовать функцию 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
В ФП не указан источник отделов. Подзапрос можно заменить выбором всех отделов из таблицы, если она существует.
Я бы порекомендовал иметь отдельный набор данных, который определяет все ожидаемые вами отделы. Затем вы можете присоединиться к нему слева. Это гарантирует, что у вас всегда будут данные по всем магазинам. Например:
/* 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 и оставите соединение, вы получите тот же ответ.
Если вы не можете предположить, что ваши данные будут полностью охватывать отделы, вам понадобится отдельный набор данных, перечисляющий полный список.
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
;
Не могли бы вы добавить некоторые простые данные и ожидаемый результат? также отметьте используемую вами СУБД