chints786 Ответов: 1

Sql server запрашивает, чтобы найти нет транзакций в день, а также в месяц


Привет,

В ней есть таблица, состоящая из 11 записей lac plus. Таблица состоит из 3 столбцов

CustomerId TransactionDate TransactionType

В приведенной выше таблице есть около 9 lac различных клиентов, которые совершали сделки ежедневно в течение месяца.

За каждую транзакцию, совершенную одним клиентом, он получает 5 баллов.

В день клиент имеет право сделать 4 сделки, таким образом, он будет иметь право на 20 баллов в день.

Пожалуйста, обратите внимание, что клиент может свободно делать " N " никаких транзакций в день, но требование гласит, что заморозьте его на 4 транзакции в день и 10 транзакций в месяц.

Это было достигнуто мной.

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу знать, что из 9 различных клиентов lac есть способ узнать, сколько транзакций клиент совершил за месяц, а также за день

Примерно так:-

"Кодклиента" тип transactindate
1 2016-01-01 а
1 2016-01-01 а
1 2016-01-01 а
1 2016-01-02 a

выход:-
CustomerID day_count месячные баллы приемлемые
1 3 4 20


Обратите внимание, что один и тот же клиент может совершать в один и тот же год множество транзакций, но в разные месяцы по несколько дней.

Пожалуйста помочь

Что я уже пробовал:

Я попробовал использовать group by ...

Но не смогли получить желаемого результата

1 Ответов

Рейтинг:
9

Richard Deeming

Цитата:
требование гласит заморозить его на 4 сделки в день и 10 сделок в месяц

Так что-то вроде этого?
WITH cteByDay As
(
    SELECT
        CustomerId,
        TransactionDate,
        Count(1) As TransactionCount
    FROM
        YourTable
    GROUP BY
        CustomerId,
        TransactionDate
),
cteByMonth As
(
    SELECT
        CustomerId,
        DateFromParts(Year(TransactionDate), Month(TransactionDate), 1) As TransactionMonth,
        SUM(CASE 
            WHEN TransactionCount > 4 THEN 4 
            ELSE TransactionCount 
        END) As TransactionCount
    FROM
        cteByDay
    GROUP BY
        CustomerId,
        DateFromParts(Year(TransactionDate), Month(TransactionDate), 1)
)
SELECT
    CustomerId,
    TransactionMonth,
    CASE
        WHEN TransactionCount > 10 THEN 10 
        ELSE TransactionCount 
    END As TransactionCount
FROM
    cteByMonth
ORDER BY
    CustomerId,
    TransactionMonth
;

Это даст вам список месяцев и идентификаторов клиентов, с количеством транзакций для этого клиента в течение этого месяца, ограниченным максимум 4 транзакциями в день или 10 транзакциями в месяц.


Maciej Los

Простите, я могу проголосовать только за 5!

chints786

@Richard:- большое спасибо за решение. Однако есть небольшая борьба с этим решением, и я должен был бы упомянуть в самом начале, что мой SQL Server 2008 R2-это то, что я использую прямо сейчас, и встроенная функция (DateFromParts) применима с 2012 года.

Будет полезно, если вы поделитесь решением для замены этой функции.

Richard Deeming

Попробуй:

DateAdd(day, 1 - Day(TransactionDate), TransactionDate)