Как правильно SQL-запрос для этого: - PullRequest
0 голосов
/ 17 марта 2019

Пожалуйста, помогите мне с запросом SQL получить таблицу, содержащую список клиентов, суммы их покупок и их телефоны с учетом следующих условий:

  1. Первая покупка была не ранее 2017 года
  2. Клиент совершил более 3 покупок с 2017 года

У меня есть следующие таблицы:

1 purchases:

    1.1. purchase_id
    1.2. user_id
    1.3. purchase_date
    1.4. price

2 users:

    2.1. user_id
    2.2. phone

Ответы [ 4 ]

1 голос
/ 17 марта 2019

Присоединяйтесь к ним и группируйте по полям пользователя.

И с HAVING он может фильтровать по всем покупкам и минимальной дате покупки в 2017 году и далее.

SELECT u.user_id, u.phone, 
 SUM(p.price) AS TotalPurchasePrice
FROM users u
JOIN purchases p ON p.user_id = u.user_id
GROUP BY u.user_id, u.phone
HAVING COUNT(p.purchase_id) > 3 
   AND MIN(p.purchase_date) >= CAST('2017-01-01' AS DATE)
1 голос
/ 17 марта 2019

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

SELECT u.user_id,
       u.Phone,
       SUM(CASE WHEN p.purchase_date >= '20170101' THEN Price END) AS TotalPrice
FROM users u
     JOIN purchases p ON u.user_id = p.user_id
GROUP BY u.user_id,
         u.phone
HAVING MIN(p.purchase_date) >= '20170101'
   AND COUNT(CASE WHEN p.purchase_date >= '20170101' THEN 1 END) > 3;
0 голосов
/ 17 марта 2019

Я думаю, что самый простой запрос:

SELECT u.user_id, u.Phone, SUM(Price) AS TotalPrice
FROM users u JOIN
     purchases p
     ON u.user_id = p.user_id
GROUP BY u.user_id, u.phone
HAVING MIN(p.purchase_date) >= '2017-01-01' AND
       COUNT(*) > 3;

Первое условие HAVING проверяет, что самая ранняя дата покупки - 2017-01-01 или позже. Второй проверяет, что есть как минимум три покупки На самом деле, это предполагает, что users.user_id уникален, но это разумное предположение.

0 голосов
/ 17 марта 2019

Я не знаком с sql-сервером, но в типичном SQL вы можете сделать следующее. Надеюсь, это поможет.

with query1 as (
    select
        users.user_id,
        min(phone) as phone,
        min(purchase_date) as first_purchase,
        sum(price) netpurchase,
        count(distinct purchase_date) counttxn
    from users
    join purchases
        on users.user_id = purchases.user_id
    group by users.user_id
)

select * from query1
where first_purchase >= date('2017-01-01') and counttxn > 3

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

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