Я создаю ежедневный отчет о транзакциях, которые произошли накануне покупки (как новой, так и предыдущей). Для простоты это выглядит так:
SELECT
Table.Identifier as 'Number',
Table.Name as 'Customer Name',
Table.PurchaseDate as 'Date',
sum(Table.Amount) as 'Amount',
Case
when 'SOME CODE' then 'NEW'
when sum(Table.Amount) > 0 then 'INC'
when sum(Table.Amount) < 0 then 'DEC'
end case as 'Transaction Type'
Where
Table.TransactionEntryDate = DATEADD(DAY, CASE (DATEPART(WEEKDAY, GETDATE()) + @@DATEFIRST) % 7
WHEN 1 THEN -2
WHEN 2 THEN -3
ELSE -1
END, DATEDIFF(DAY, 0, GETDATE()))
Дата транзакции - последний рабочий день (если сегодняшний понедельник, последний день - пятница), я хочу только записи с датой транзакции в качестве последней бизнес-даты, но чтобы классифицировать его как NEW
тип транзакции, мне нужно посмотреть, является ли сегодняшняя дата транзакции минимальной датой транзакции для Identifier / Number
. но поскольку предложение WHERE
уже отфильтровывает все необязательные даты, любое предложение, которое я поместил в 'SOME CODE'
место предложения CASE
, вернет NEW
ie, если мы рассмотрим два случая
Идентификатор транзакции # 1 происходят несколько дней go, но транзакция возврата и другая покупка была сделана в предыдущий рабочий день. (Мы заботимся о транзакции net). Таким образом, в таблице 2 записи. Я хочу, чтобы функция CASE видела, что минимальная (ie первая) дата входа НЕ является предшествующим рабочим днем, и перейду к делу "DE C".
Идентификатор транзакции № 5 происходит в предыдущий рабочий день. Это первая запись в таблице. Я хочу, чтобы функция case распознала, что самая ранняя дата ввода идентификатора № 5 является предшествующей рабочей датой, поэтому функция CASE назначает тип транзакции как NEW.
Однако я не могу использовать функцию подсчета, поскольку иногда в один и тот же день происходит несколько транзакций для одного и того же идентификатора, и я хочу, чтобы они суммировались. Иногда «Дата покупки» отличается от даты транзакции, так как заказы предварительно заказываются до фактической транзакции, поэтому я не могу просто сделать when PurchaseDate = TransactionEntryDate
Вот то, что я хотел бы таблицу выглядеть. Однако, поскольку для идентификатора № 1 отфильтрована транзакция 25 февраля, a, когда when min(Table.TransactionEntryDate) = Table.TransactionEntryDate
then 'NEW'
также вернет 'NEW'
Примерно так (но в моем запросе это не работает)
when min(All Table.TransactionEntryDate where Table.identifier= Table.Identifier AND Table.PurchaseDate= Table.PurchaseDate) = DATEADD(DAY, CASE (DATEPART(WEEKDAY, GETDATE()) + @@DATEFIRST) % 7
WHEN 1 THEN -2
WHEN 2 THEN -3
ELSE -1
END, DATEDIFF(DAY, 0, GETDATE())) then 'NEW'