我正在根据每个客户和订单日期的组合查找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种价格时,我仍然不能告诉你你想要什么。你必须决定你想要什么,然后编写查询来得到它。