我有名字命令表:
id id_o value date 1 1 400 2014-09-30 2 1 300 2014-09-30 3 1 200 2014-09-30 4 2 100 2014-09-30 5 2 200 2014-09-30 6 3 50 2014-09-29 7 3 100 2014-09-29 8 4 300 2014-09-29 9 5 600 2014-09-28
我需要选择每个按id_o分组的订单,其中sum(value)< 700,从这个选定的表中,我需要按数据分组的显示数据。 我使用多个选择:
select date, sum(mno) as mn
from (
select date,sum(value) as 'mno'
from orders
group by id_o
having sum(value)<700
) table_alias
group by date
结果是:
date mn 2014-09-30 300 2014-09-29 450 2014-09-28 600
是否有可能替换或简化此相关查询?
答案 0 :(得分:1)
您的内部查询无效。它按id_o
分组,但按date
选择。为了解决这个问题,请在内部查询分组中添加一个额外的列(假设每个id_o
的日期始终相同)。您可以启用sql_mode
的{{1}}来启用强检查功能。 SQL fiddle中的完整示例。
ONLY_FULL_GROUP_BY
MySQL允许这种类型的查询,但这样做并不常见。请考虑以下数据:
id id_o value date 1 1 400 2014-09-29 2 1 300 2014-09-30 3 1 200 2014-09-30
SELECT
date,
SUM(mno) AS mn
FROM (
SELECT
id_o,
date,
SUM(value) AS mno
FROM orders
GROUP BY
id_o,
date
HAVING
SUM(value) < 700
) totalPerOrder
GROUP BY date
(s)会date
返回什么?它可能是第一个,最后一个,平均的,最常见的一个,但更好地说明一点。任何其他DBMS都不允许您执行此查询。
除此之外,我会将一些列重命名为更具表现力。 SELECT date, SUM(value) FROM orders GROUP BY id_o
,mn
和mn_o
就是一个例子。 id_o
也没有描述任何东西,任何东西都可以是一个价值。甚至可以将value
字段称为date
。查询本身似乎很好(尽管如果可能缺少索引,请注意)。