还是这个问题,请大家注意我是想问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联机丛书里的例子

解决方案 »

  1.   

    你可能误解了。其实很简单,一个订单可能含有多笔细项,你的做法的是仅仅将那笔订单细项的UnitPrice>100的抓取出来计算,
    而原来的SQL是将只要细项含有一笔UnitPrice>100的订单的所有细项都抓取出来进行计算.
      

  2.   

    2楼请看一下,OrdD1 和 OrdD2 都是指的 Order Details 表,请给个正解,原题WHERE是采用子查询的方式把符合条件的找出来,而我是直接将价格符合条件的过滤出来
    请教,请教
      

  3.   

    假如Order Details表的内谷就下面这几条,OrderID     ProductID   UnitPrice             Quantity 
    ----------- ----------- --------------------- -------- 
    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笔都列入了计算.这样讲清楚了吧.
      

  4.   

    假设[Order Details]的内容如下OrderID     ProductID   UnitPrice             Quantity 
    ----------- ----------- --------------------- -------- 
    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)
      

  5.   

    我也运行了一下,结果是不一样的。感觉好像是一样的,但细想,确实不同。比如第一个SQL,把UnitPrice>100的订单号列出来,然后算这些订单号的合计数。这些订单号下面可能包括UnitPrice<100的行,这些行也都进行汇总。
    而你的做法呢,是先筛选UnitPrice>100的行,对这些行进行汇总。如果一个订单的某些行的UnitPrice>100,某些行UnitPrice<=100,那只合计UnitPrice>100的行。而第一个SQL则计算所有的不管UnitPrice是否大于100,都进行计算。
    两种写法的描述方法也是不一样的:
    第一种——只要订单的UnitPrice曾大于100,就计算该订单的所有行的数量与金额的合计。
    第二种——只计算订单UnitPrice大于100的行的数量与金额的合计。
      

  6.   

    谢谢,正解,我还以为是我理解SQL有问题,没有注意到数据的变化