【发布时间】:2020-03-02 14:05:03
【问题描述】:
我正在为购买前一天发生的交易(新的和以前的)创建每日报告。为简单起见,它看起来像:
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 子句已经过滤掉了所有不需要的日期,所以我在CASE 子句的'SOME CODE' 位置放置的任何子句都将返回NEW
如果我们考虑这两种情况
交易标识符 #1 发生在几天前,但在前一个工作日进行了退货交易和另一次购买。 (我们关心净交易)因此表中有 2 个条目。我希望 CASE 函数看到最小(即第一个)输入日期不是前一个工作日,并继续处理“DEC”案例。
交易标识符#5 出现在前一个工作日。这是表中的第一个条目。我希望 case 函数能够识别 Identifier #5 的最早进入日期是之前的营业日期,因此 CASE 函数将 Transaction Type 分配为 NEW。
但是,我不能使用计数功能,因为有时同一标识符有多个交易,我希望它们相加。有时“购买日期”与交易日期不同,因为订单是在实际交易之前预订的,所以我不能只做when PurchaseDate = TransactionEntryDate
这是我希望桌子的样子。然而,由于标识符 #1 过滤掉了 2 月 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'
【问题讨论】: