我正在为购买前一天发生的交易(新的和以前的)创建每日报告。为简单起见,它看起来像:
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发生在前一个工作日。这是表中的第一项。我希望案例函数能够识别出标识符#5的最早输入日期是先前的工作日期,因此CASE函数会将“交易类型”分配为“新”。
但是,我不能使用计数功能,因为有时同一天同一标识符有多笔交易,我希望对它们进行汇总。有时,“购买日期”与交易日期不同,因为订单是在实际交易之前预先订购的,所以我不能只是when PurchaseDate = TransactionEntryDate
这是我希望桌子看起来像的样子。但是,由于#1标识符已滤除2月25日的交易,当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'
答案 0 :(得分:1)
我认为如果存在较早的行,它将为每一行标识
OUTER APPLY (SELECT TOP(1) Identifier
FROM Table T1
WHERE T1.Identifier = Table.Identifier
AND T1.TransactionEntryDate < Table.TransactionEntryDate) AS PriorTransactionExists
然后根据您的情况:
CASE WHEN PriorTransactionExists.Identifier IS NULL THEN 'NEW'
您可能只是做一个内联而不是外部应用?希望我能理解,但如果不能,我会道歉。
在实现这是MySQL之后进行编辑:
Case when not exists (SELECT 1 FROM Table T1
WHERE T1.Identifier = Table.Identifier
AND T1.TransactionEntryDate < Table.TransactionEntryDate) THEN 'New'