WHERE或HAVING在SQL中通过customer_id返回聚合



我正在根据每个客户和订单日期的组合查找50美元和200美元范围内的最大采购金额订单。

对于2个不同的查询,我没有结果集,所以我不理解WHERE和HAVING之间的区别。

查询1:WHERE子句

SELECT id, order_date, MAX(price)
FROM orders
WHERE price BETWEEN 50 AND 200
GROUP BY id;
查询2:HAVING clause
SELECT id, order_date, MAX(price)
FROM orders
GROUP BY id
HAVING MAX(price) BETWEEN 50 AND 200

查询1的结果:

id  order_date  MAX(price)
1   2013-01-10  103.50
5   2013-01-01  195.50
6   2013-01-01  172.50
8   2013-01-01  147.20
9   2013-01-01  165.60
10  2013-01-01  184.00
12  2013-01-18  191.40
24  2013-01-02  138.00
25  2013-01-07  100.63
26  2013-01-16  86.71
30  2013-01-03  155.25
35  2013-01-08  96.60
36  2013-01-02  169.74
40  2013-01-03  197.80
45  2013-01-02  124.20
48  2013-01-02  149.04
50  2013-01-03  157.55
52  2013-01-03  173.42
60  2013-01-03  186.30
75  2013-01-02  181.13
100 2013-01-04  147.20
125 2013-01-04  184.00

Result for Query 2:

id  order_date  MAX(price)
25  2013-01-03  100.63
26  2013-01-16  86.71
35  2013-01-08  96.60
45  2013-01-02  124.20
52  2013-01-03  173.42

似乎这是预期的HAVING子句查询的结果,我不明白为什么甚至是2个查询之间的差异。

因为WHERE子句将所选行限制为指定范围内的行,所以MAX(price)肯定在该范围内,因为WHERE子句排除了所有price为<50或>200 .

然而,HAVING子句是在MAX被选中之后应用的。如果一行有MAX(price) <50或>

哪一个是正确的我不知道,因为我不知道你的要求。你得自己决定。

补充道:

如果您有一个客户在同一天有4笔交易,价格分别为10,100,150和500,那么:WHERE price BETWEEN 50 AND 200将挑选出100和150个事务。GROUP BY将挑选出150,并丢弃100。

同样,如果没有WHERE,查询将选择所有4个事务,然后GROUP BY将选择500个事务并删除其他3个事务。最后,HAVING将掉下500,没有任何东西可以显示。

像这样放入几天的数据,然后玩各种各样的WHERE's和HAVING's,看看当你同时拥有两者时会发生什么。你需要玩这些东西来适应它。

当你有4种价格时,我仍然不能告诉你你想要什么。你必须决定你想要什么,然后编写查询来得到它。

相关内容

最新更新