Несколько агрегатов в запросе SQL - PullRequest
0 голосов
/ 29 марта 2020

Пожалуйста, помогите мне обернуть голову вокруг подзапросов (при условии, что это то, что здесь необходимо) У меня есть таблица заказов и клиентов . Я хочу написать запрос, который показывает мне как количество заказов для всех клиентов, так и количество заказов для клиентов с указанным профилем c.

select count(o.order_no) from orders o
where o.order_dt = '20200320'

и

select count(o.order_no) from orders o
left join customers c on o.cust_no = c.cust_no
where o.order_dt = '20200320' and c.cust_prfl in ('C', 'D')

Итак, я ищу два агрегатных значения одновременно - сначала количество заказов на установленную дату, а затем также тот же агрегат, но с дополнительным условием клиентов с указанным профилем c. Следовательно, результат должен быть:

3 2

Дополнительный гаечный ключ, который у меня есть, - это то, что я бы даже хотел, чтобы таблица customer быть включенным select count(c.cust_prfl) from customers c where c.cust_prfl in ('C', 'D', 'E'), но это не проблема. Но в идеальном случае у меня будет 3 2 3

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

ORDERS
Order_no   Order_dt   Cust_no
101        20200303     1
102        20200320     3
103        20200320     3
104        20200320     2

CUSTOMERS
Cust_no    Cust_prfl
1          A
2          B
3          C
4          C
5          D

Ответы [ 2 ]

2 голосов
/ 29 марта 2020

Вы можете выполнить свое исходное требование с помощью условного агрегирования по существующему запросу (хотя просто используя JOIN вместо LEFT JOIN, поскольку предположительно во всех заказах должны быть существующие клиенты):

SELECT
  COUNT(*) AS orders,
  COUNT(CASE WHEN Cust_prfl IN ('C', 'D') THEN 1 END) AS orders_cust
FROM (
  SELECT o.order_dt, c.Cust_prfl
  FROM orders o
  JOIN customers c ON c.Cust_no = o.Cust_no
  WHERE o.order_dt = '20200320'  
) o

Кому Для получения общего числа клиентов с различными профилями требуется отдельный подзапрос, но вы также можете добавить его к этому запросу:

SELECT
  COUNT(*) AS orders,
  COUNT(CASE WHEN Cust_prfl IN ('C', 'D') THEN 1 END) AS orders_cust,
  (SELECT COUNT(*) FROM customers WHERE Cust_prfl IN ('C', 'D', 'E')) AS cde_customers
FROM (
  SELECT o.order_dt, c.Cust_prfl
  FROM orders o
  JOIN customers c ON c.Cust_no = o.Cust_no
  WHERE o.order_dt = '20200320'  
) o

Вывод:

orders  orders_cust     cde_customers
3       2               3

Демонстрация включена SQLFiddle

0 голосов
/ 29 марта 2020

Насколько я понял, вы задали вопрос Joey112, ниже приведены два запроса.

1) С помощью этого запроса вы можете получить все данные

select o.order_no, o.order_dt, c.cust_no, c.cust_prfl
from orders o
  left join customers c
    on o.cust_no = c.cust_no

2) Здесь вы подаете заявление только там, где условия

select o.order_no, o.order_dt, c.cust_no, c.cust_prfl
from orders o
  left join customers c
    on o.cust_no = c.cust_no
where o.order_dt = '20200320' and c.cust_prfl in ('C', 'D')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...