简要的说
我有三个表
图书信息表: 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 不是就会按照具体时间分组进行求和 而我的本意是在某一个时间段进行求和。这该如何是好啊

解决方案 »

  1.   

    再简化一下我的问题。
    假设我只有一张表:
       tb_booksell:
           字段: 销售单号 书名 销售量 时间
    我要输出一段时间内的图书销售排行统计(书名 销售量):select 书名, SUM(销售量) from tb_booksell group by 书名 \
          having 时间 between '2013/2/6' and '2013/5/21' 这样会报错,因为having子句中的时间字段不在group by子句或者聚合函数中
    但是如果我将'时间'放在group by后 SUM将计算某天某书的销售量 就不是我本意的计算在特定日期范围内某书的销售量了。 如何修正?
      

  2.   

    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
      

  3.   

    你干嘛要having而不直接在where中就筛选掉呢?
      

  4.   

    刚入SQL 多谢版主及时相救 嘿嘿