Я создаю ежедневный отчет по транзакциям, которые произошли накануне при покупке (как новой, так и предыдущей). Для простоты это выглядит так:
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
т.е. если мы рассмотрим два случая
Идентификатор транзакции № 1 произошел несколько дней назад, но транзакция возврата и другая покупка были совершены накануне рабочего дня. (Нам важна чистая транзакция). Таким образом, в таблице есть 2 записи. Я хочу, чтобы функция CASE увидела, что минимальная (т.е. первая) дата входа НЕ является предыдущим рабочим днем, и продолжила бы дело "DEC".
Идентификатор транзакции № 5 происходит накануне рабочего дня. Это первая запись в таблице. Я хочу, чтобы функция case распознавала, что самая ранняя дата входа идентификатора № 5 является предыдущей рабочей датой, поэтому функция CASE назначает тип транзакции как NEW.
Однако я не могу использовать функцию подсчета, так как иногда для одного и того же идентификатора в один и тот же день выполняется несколько транзакций, и я хочу, чтобы они суммировались. Иногда «Дата покупки» отличается от даты транзакции, так как заказы предварительно заказываются до фактической транзакции, поэтому я не могу просто сделать when PurchaseDate = TransactionEntryDate
Вот как я хочу, чтобы таблица выглядела. Однако, поскольку в идентификаторе № 1 отфильтрована транзакция от 25 февраля, когда when min(Table.TransactionEntryDate) = Table.TransactionEntryDate
then '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'