还是这个问题,请大家注意我是想问Where修改后为什么不行HAVING 子句通常与 GROUP BY 子句结合使用,尽管指定该子句时也可以不带 GROUP BY。HAVING 子句指定在应用 WHERE 子句的筛选后要进一步应用的筛选。例如,下列 WHERE 子句仅限定以高于 $100 的单价销售产品的订单,而 HAVING 子句进一步将结果限制为只包括 100 件以上的订单:SELECT OrdD1.OrderID AS OrderID,
SUM(OrdD1.Quantity) AS "Units Sold",
SUM(OrdD1.UnitPrice * OrdD1.Quantity) AS Revenue
FROM [Order Details] AS OrdD1
WHERE OrdD1.OrderID in (SELECT DISTINCT OrdD2.OrderID
FROM [Order Details] AS OrdD2
WHERE OrdD2.UnitPrice > $100)
GROUP BY OrdD1.OrderID
HAVING SUM(OrdD1.Quantity) > 100当我看到这个语句时,个人理解可以写成SELECT OrdD1.OrderID AS OrderID,
SUM(OrdD1.Quantity) AS "Units Sold",
SUM(OrdD1.UnitPrice * OrdD1.Quantity) AS Revenue
FROM [Order Details] AS OrdD1
WHERE OrdD1.UnitPrice > $100
GROUP BY OrdD1.OrderID
HAVING SUM(OrdD1.Quantity) > 100但是运行后发现这样不行,想请教大家给个解释,这个是SQL Server2000联机丛书里的例子
SUM(OrdD1.Quantity) AS "Units Sold",
SUM(OrdD1.UnitPrice * OrdD1.Quantity) AS Revenue
FROM [Order Details] AS OrdD1
WHERE OrdD1.OrderID in (SELECT DISTINCT OrdD2.OrderID
FROM [Order Details] AS OrdD2
WHERE OrdD2.UnitPrice > $100)
GROUP BY OrdD1.OrderID
HAVING SUM(OrdD1.Quantity) > 100当我看到这个语句时,个人理解可以写成SELECT OrdD1.OrderID AS OrderID,
SUM(OrdD1.Quantity) AS "Units Sold",
SUM(OrdD1.UnitPrice * OrdD1.Quantity) AS Revenue
FROM [Order Details] AS OrdD1
WHERE OrdD1.UnitPrice > $100
GROUP BY OrdD1.OrderID
HAVING SUM(OrdD1.Quantity) > 100但是运行后发现这样不行,想请教大家给个解释,这个是SQL Server2000联机丛书里的例子
而原来的SQL是将只要细项含有一笔UnitPrice>100的订单的所有细项都抓取出来进行计算.
请教,请教
----------- ----------- --------------------- --------
10248 11 101.000 126
10248 42 9.8000 10
10248 72 34.8000 5
10249 14 18.6000 9
10249 51 42.4000 40
你写的SQL仅仅是将加红字的那一笔列入计算,而原来的SQL是将订单号为10248的3笔都列入了计算.这样讲清楚了吧.
----------- ----------- --------------------- --------
10248 11 120.0000 355
10248 42 9.8000 10
10248 72 34.8000 5
10249 14 18.6000 9
10249 51 42.4000 40 你写的SQL就只是将红字的那一笔列入计算,而原来的SQL是将订单号为10248的3笔都列入了计算.
注意 WHERE OrderID IN (Select ... FROM [Order Details] WHERE UnitPrice>100)
而你的做法呢,是先筛选UnitPrice>100的行,对这些行进行汇总。如果一个订单的某些行的UnitPrice>100,某些行UnitPrice<=100,那只合计UnitPrice>100的行。而第一个SQL则计算所有的不管UnitPrice是否大于100,都进行计算。
两种写法的描述方法也是不一样的:
第一种——只要订单的UnitPrice曾大于100,就计算该订单的所有行的数量与金额的合计。
第二种——只计算订单UnitPrice大于100的行的数量与金额的合计。