Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL中嵌套的where、group by和min/max_Sql_Ms Access - Fatal编程技术网

SQL中嵌套的where、group by和min/max

SQL中嵌套的where、group by和min/max,sql,ms-access,Sql,Ms Access,我在MS Access中有这个表,需要为一个报告编写一个查询,我正在努力。 我的SQL基本上已经使用了至少5年,而且从来没有那么好,但我想我可以不用太多麻烦就做到这一点……唉 产品 产品子代码 OrderDateTime 订单金额 A. 1. 2021-05-25 11:30 5. A. 2. 2021-05-25 12:30 50 A. 1. 2021-05-25 13:30 500 B 1. 2021-05-25 09:30 400 B 2. 2021-05-25 10:30 40 B 1.

我在MS Access中有这个表,需要为一个报告编写一个查询,我正在努力。 我的SQL基本上已经使用了至少5年,而且从来没有那么好,但我想我可以不用太多麻烦就做到这一点……唉

产品 产品子代码 OrderDateTime 订单金额 A. 1. 2021-05-25 11:30 5. A. 2. 2021-05-25 12:30 50 A. 1. 2021-05-25 13:30 500 B 1. 2021-05-25 09:30 400 B 2. 2021-05-25 10:30 40 B 1. 2021-05-25 11:30 4. C 1. 2021-05-25 13:30 30 C 1. 2021-05-25 14:30 300 C 2. 2021-05-25 15:30 3. A. 2. 2021-05-24 11:30 5. A. 2. 2021-05-24 12:30 50 A. 1. 2021-05-24 13:30 500 B 1. 2021-05-24 09:30 400 B 1. 2021-05-24 10:30 40 B 1. 2021-05-24 11:30 4. C 1. 2021-05-24 13:30 30 C 1. 2021-05-24 14:30 300 C 2. 2021-05-24 15:30 3.
在子查询中使用alias对表进行以下小调整:

选择 产品 产品子代码, 从TableName中选择MINT1。[订单金额]作为T1 其中T1.Product=TableName.Product和DateValueT1.OrderDateTime=DateAddd,-1,日期为MinDayed, 从TableName中选择MAXT2。[订单金额]作为T2 其中T2.Product=TableName.Product和DateValueT2.OrderDateTime=DateAddd,-1,日期为maxDayed, 从TableName中选择MINT3。[订单金额]作为T3 其中T3.Product=TableName.Product和DateValueT3.OrderDateTime=DateAddd,-2,日期为MinTwoTodayAgo, 从TableName中选择MAXT4。[订单金额]作为T4 其中T4.Product=TableName.Product和DateValueT4.OrderDateTime=DateAddd,-2,日期为MaxTwoDaysAgo 从…起 表名 分组 产品 产品子代码
我觉得你很接近,只是稍微改变了一下:

在列名中最好避免使用空格,因此使用OrderAmount。如果无法更改列名,则最小[订单金额]将取代最小订单金额

所有行中都有MIN,而它应该是MIN和max

我把>=改成了=因为你需要一个严格的等式

将列别名masterID更改为表别名t1


使用条件聚合

SELECT Product as masterID, ProductSubCode,
       MIN(IIF(OrderDateTime >= DateAdd("d", -1, Date()) AND OrderDateTime < Date(), [Order Amount], NULL) as MinYesterday,
       MAX(IIF(OrderDateTime >= DateAdd("d", -1, Date()) AND OrderDateTime < Date(), [Order Amount], NULL) as MaxYesterday,
       MIN(IIF(OrderDateTime >= Date(), [Order Amount], NULL) as MinToday,
       MIN(IIF(OrderDateTime >= Date(), [Order Amount], NULL) as MaxToday
FROM TableName
WHERE OrderDateTime >= DateAdd("d", -1, Date())
GROUP BY Product, ProductSubCode;
除了更加简洁之外,您还应该发现它的性能要好得多


注意:此特定公式假设您没有未来的订单日期。扩展WHERE子句可以很容易地删除将来的订单日期,如果这是一个问题。

谢谢,上面不是我的实际列/表名,但这很有效!看起来这也行,但我没有尝试,但感谢堆的回应:
SELECT Product as masterID, ProductSubCode,
       MIN(IIF(OrderDateTime >= DateAdd("d", -1, Date()) AND OrderDateTime < Date(), [Order Amount], NULL) as MinYesterday,
       MAX(IIF(OrderDateTime >= DateAdd("d", -1, Date()) AND OrderDateTime < Date(), [Order Amount], NULL) as MaxYesterday,
       MIN(IIF(OrderDateTime >= Date(), [Order Amount], NULL) as MinToday,
       MIN(IIF(OrderDateTime >= Date(), [Order Amount], NULL) as MaxToday
FROM TableName
WHERE OrderDateTime >= DateAdd("d", -1, Date())
GROUP BY Product, ProductSubCode;