日期:2014-05-17  浏览次数:20550 次

多表内连接和聚合函数的使用问题(group by having子句)
简要的说
我有三个表
图书信息表: tb_book
            字段: 条形码 书名
销售主表    tb_sell_main
            字段:  销售单号  时间
销售明细表  tb_sell_sub
            字段: 销售单号  条形码  数量

现在我要知道在某段时间内 图书的销量排行(图书名 销量)
我的查询语句是:

select a.书名, SUM(c.数量) from (tb_book a inner join tb_sell_sub c on a.条形码 = c.条形码) \
     inner join tb_sell_main b on c.销售单号 = b.销售单号 \
     group by a.条形码, a.书名 \
     having b.时间 between '2013/2/6' and '2013/5/21' order by SUM(c.数量) desc

这样会报错:having子句包含的列b.时间无效 因为该列没有包含在聚合函数或group by子句中
如果我把b.时间 放在group by后,那么group的聚合函数SUM 不是就会按照具体时间分组进行求和 而我的本意是在某一个时间段进行求和。这该如何是好啊

------解决方案--------------------
SELECT  a.书名 ,
        SUM(c.数量)
FROM    ( tb_book a
          INNER JOIN tb_sell_sub c ON a.条形码 = c.条形码
        )
        INNER JOIN tb_sell_main b ON c.销售单号 = b.销售单号
WHERE   b.时间 BETWEEN '2013/2/6' AND '2013/5/21'
GROUP BY a.条形码 ,
        a.书名
ORDER BY SUM(c.数量) DESC