Как использовать MIN () по дате в предложении, которое использует SUM () для другой даты? - PullRequest
0 голосов
/ 12 июня 2019

Мне нужно найти всех клиентов, которые получили свой первый заказ в 2017 году, и подвести итоги своих доходов в 2018. У меня возникла проблема с попыткой сделать это в предложении SQL.

В моей таблице 3 клиента, 2 из которых были впервые заказаны в 2017-05-23, а 1 - в 2016-06-23. Поэтому я хочу отфильтровать одного клиента, который заказал в 2016 году. В таблице у меня есть поля: client, доход, order_date.

Вот что у меня есть в MySQL:

select client as 'Clients first order in 2017',
       SUM(income) as 'Sum of income in 2018'  
from orders
where YEAR(order_date) = 2018
  and (select client, order_date
       from orders
       group by client
       having min(year(order_date)) = 2017)
order by client

Я ожидаю получить всех клиентов, которые впервые заказали в 2017 году, и подвести итоги своих доходов за 2018 год

Ответы [ 2 ]

2 голосов
/ 12 июня 2019

Использовать условную агрегацию:

Select client as 'Clients first order in 2017', 
        SUM(CASE WHEN YEAR(order_date) = 2018 
                 THEN income 
                 ELSE 0 
            END) as 'Sum income in 2018'  
FROM orders
GROUP BY client
HAVING MIN (YEAR(order_date)) = 2017
order by client
0 голосов
/ 12 июня 2019

Попробуйте это-

SELECT 
client as 'Clients first order in 2017', 
SUM(income)  as 'Sum of income in 2018'
FROM orders 
WHERE client IN
(
    SELECT client 
    FROM orders 
    GROUP BY client
    HAVING MIN(YEAR(order_date)) = 2017
)
AND YEAR(order_date) = 2018
GROUP BY client 
...