2016-08-18 4 views
0

У меня есть ситуации, как показано ниже:Считайте транзакции в течение месяца только один раз

У меня есть две таблицы базы данных. Первая таблица, которую я буду называть TB1, содержит все зарплаты, которые клиент кредитует & также дату совершения транзакции. Вторая таблица, которую я буду называть TB2, содержит все продукты, которые клиент имеет в банке. Моя цель - найти количество зарплат, которое клиент получил до того дня, когда у него появился продукт (ПЕРЕЗАГРУЗКА в моем случае) в нашем банке. До сих пор все работает нормально, и я сделал запрос на извлечение необходимых данных. Единственная проблема заключается в том, что мне нужно улучшить запрос. Таким образом, если у определенного клиента больше 1 зарплаты (например, каждые 15 дней) в течение того же месяца того же года, зарплата подсчитывается только один раз. Как я могу это сделать ПОЖАЛУЙСТА?

Этот запрос, как показано ниже:

SELECT TB1.customer_id, COUNT(TB1.customer_id) 
FROM table_1 TB1 
JOIN 
(SELECT TB2.CUSTOMER_ID, TB2.OD_START_DATE 
    FROM table_2 TB2 
    JOIN table_2 TB2_MAX 
    ON TB2.CUSTOMER_ID = TB2_MAX.CUSTOMER_ID 
    HAVING TB2.od_start_date = MAX(TB2.od_start_date) 
    GROUP BY TB2.customer_id, TB2.od_start_date 
) TB2 
ON TB1.CUSTOMER_ID = TB2.CUSTOMER_ID 
WHERE TB1.DATE_FROM < TB2.OD_START_DATE 
GROUP BY TB1.CUSTOMER_ID 

PS: DATE_FROM поле содержит дату, когда сделка сделана, в то время как OD_START_DATE поле содержит дату, когда открыт последний продукт.

ответ

1

JOIN в вашем внутреннем запросе является избыточным. Вам просто нужна максимальная дата для каждого клиента. В вашем внешнем запросе вы должны рассчитывать DATE_FROM, а не Customer_Id. Поскольку вы хотите рассчитывать только один раз для транзакций за месяц, конвертируйте DATE_FROM в комбинацию года и используйте DISTINCT для подсчета только один раз.

SELECT TB1.customer_id, COUNT(DISTINCT TO_CHAR(TB1.DATE_FROM,'YYYYMM')) 
FROM table_1 TB1 
JOIN 
(SELECT CUSTOMER_ID, MAX(OD_START_DATE) AS OD_START_DATE 
    FROM table_2 
    GROUP BY customer_id 
) TB2 
ON TB1.CUSTOMER_ID = TB2.CUSTOMER_ID 
WHERE TB1.DATE_FROM < TB2.OD_START_DATE 
GROUP BY TB1.CUSTOMER_ID 
+0

Спасибо Ноэль, я не делал точно, что вы сказали, но COUNT (DISTINCT TO_CHAR (TB1.DATE_FROM, «ГГГГММ»)) спас мою жизнь :) СПАСИБО ТАК МНОГО – Marin

+0

Пожалуйста, вы можете показать мне, как это сделать? Я голосовал за решение. – Marin

+0

Просто нажмите на отметку рядом с ответом. http://stackoverflow.com/help/someone-answers – Noel

Смежные вопросы