【问题标题】:Find Earliest Transaction Date when using Transaction Date in "WHERE" clause在“WHERE”子句中使用交易日期时查找最早交易日期
【发布时间】: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'

【问题讨论】:

标签: mysql sql navicat


【解决方案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'

【讨论】:

  • 我一定要试试这个! (而且我不是最好的解释者)但我不知道在哪里将它添加到我的查询中,我是一个初学者 SQL,但知道基础知识。
  • 啊,我刚刚发现这是mysql,应该仔细看看。恐怕这可能不适用。将在几秒钟内编辑回复。
猜你喜欢
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2022-08-22
  • 2017-11-22
  • 1970-01-01
  • 2015-01-07
相关资源
最近更新 更多