@bgood

Как вывести список клиентов с непрерывной историей за год?

Есть таблица "Transactions_info" в ней колонки (date_new, Id_check, ID_client, Count_products, Sum_payment)
Нужно вывести список клиентов с непрерывной историей за год (минимум 1 покупка в месяц), учитывая, что клиент может в 1 месяц сделать несколько покупок:
SELECT `ID_client` FROM transactions_info 
WHERE COUNT (MONTH(`date_new`))>=12
  • Вопрос задан
  • 870 просмотров
Решения вопроса 1
@Cairn
Нельзя группировать просто по номеру месяца в данной ситуации, т.к. у месяцев в разных годах совпадёт номер и они сгруппируются, хотя по идее не должны.
SELECT ID_client, Avg_check, Total_sum, Purchases, ROUND(Total_sum/Purchases,2) AS Avg_transaction
FROM (
  WITH per_check_t AS (
    SELECT 
      FIRST(CONCAT(YEAR(date_new),"-",MONTH(date_new))) AS Month, 
      FIRST(CAST(date_new AS DATE)) AS Date, 
      Id_check, 
      FIRST(ID_client) AS ID_client, 
      ROUND(SUM(Sum_payment),2) AS Check_sum,
      COUNT(*) AS n_transactions
    FROM transactions
    GROUP BY Id_check)
  SELECT 
    ID_client, 
    COUNT(DISTINCT Month) AS Months,
    ROUND(AVG(Check_sum),2) AS Avg_check,
    ROUND(SUM(Check_sum),2) AS Total_sum,
    SUM(n_transactions) AS Purchases
  FROM per_check_t
  GROUP BY per_check_t.ID_client
  HAVING Months = 13
  ORDER BY Total_sum DESC) AS full_months
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@Akina
Сетевой и системный админ, SQL-программист.
SELECT ID_client
FROM Transactions_info
WHERE date_new BETWEEN @first_day_of_period
                   AND @last_day_of_period
GROUP BY ID_client
HAVING COUNT(DISTINCT date_new) = DATEDIFF(@last_day_of_period, @first_day_of_period) + 1
Ответ написан
with MyClients as
( select [ID_client], count(distinct cast([date_new] as date)) UnqDays
from [Transactions_info]
where date_new > dateadd(day,-365,getdate()) -- берём транзакции за последние 365 дней
group by [ID_client]
)
select *
from MyClients
where UnqDays>=364 --Сегодняшний день пропускаем.
/*
для Microsoft SQL Server 2005+
*/
Ответ написан
@cicatrix
было бы большой ошибкой думать
SELECT ID_client FROM 
(SELECT
ID_client, LAG(date_new, 365, 0) OVER (PARTITION BY ID_client ORDER BY date_new) diffdate
FROM Transactions_info) calcdiff
WHERE diffdate > 0

sqlfiddle.com/#!18/902cf/40

Вместо 365 вот здесь: LAG(date_new, 365, 0) надо поставить кол-во требуемых непрерывных дней
Ответ написан
Комментировать
@bgood Автор вопроса
Вобщем сделал так
SELECT ID_client,
COUNT(DISTINCT month(date_new))>=12 AS month
FROM transactions_info
GROUP BY ID_client

но оно показывает всех клиентов, а нужно только тех кто >12, пробовал через WHERE

SELECT ID_client,
COUNT(DISTINCT month(date_new)) AS month
FROM transactions_info
WHERE month>=12
GROUP BY ID_client

но пишет, что month не существует.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы