GROUP BY的替代方案

时间:2014-09-24 01:14:05

标签: mysql sql database group-by

我的表格中billID是主键:

Invoice (billID, item, value, quantity)

以及以下查询:

SELECT item, sum(quantity) AS TotalItems
FROM Invoice
WHERE value>1
GROUP BY item
HAVING sum(quantity)>10

我只需要使用SELECTFROMWHERE重写优化(或去优化?)。

  1. 取消GROUP BYHAVING的新查询是什么?
  2. 是否总能消除GROUP BY& HAVING仅使用SELECTFROMWHERE
  3. 我的方法:

    [1]我正在使用不同UNION的{​​{1}}来实现这一目标。但主要问题是我需要事先了解所有items

    item

    还有其他方法可以获得结果吗?

2 个答案:

答案 0 :(得分:6)

我们可以使用子查询并对每个项目的数量进行求和

SELECT A.item, A.Total
FROM
(  SELECT distinct item,
       (SELECT SUM(quantity)
        FROM Invoice I2 
        WHERE I2.item = I1.item) Total
FROM Invoice I1
) A
where Total >10

答案 1 :(得分:1)

虽然我 从不 建议这样做,但MySql确实支持用户定义的变量。因此,从技术上讲,您可以重写查询以对变量中的项进行求和,建立行号以获得最大值,然后仅选择每组最高总数(每个项目):

select item, totalitems
from (
  select 
    item, totalitems, @rn:=IF(@previtem=item,@rn+1,1) rn, @previtem:=item
  from (
    select item,
      @qtytotal:=(IF(@previtem=item,@qtytotal+quantity,quantity)) totalitems,
      @previtem:=item
    from invoice, (select @qtytotal:=0, @previtem:='') t
    where value > 1 
    order by item
    ) t, (select @rn:=0, @previtem:='') s
  where totalitems > 10
  order by item, totalitems desc
  ) t
where rn = 1

这是用仅使用selectfromwhere的概念编写的 - 没有sum等在技术上利用group by或者{{1}}的聚合没有条款。