2016-01-25 67 views
2

认计算列组我有以下SQL:火鸟不能by子句

select 
inv.salesman_id, 
(select salesman_goals.goal from salesman_goals 
    where salesman_goals.salesman_id = inv.salesman_id 
    and salesman_goals.group_id = g.group_id 
    and salesman_goals.subgroup_id = sg.subgroup_id 
    and salesman_goals.variation_id = v.variation_id) 
    as goal, 
sum(i.quantity) as qnt 
from invoiceitem i 
inner join invoice inv on inv.invoice_id = i.invoice_id 
inner join product p on p.product_id = i.product_id 
left join groups g on g.group_id = p.group_id 
left join subgroup sg on sg.group_id = g.group_id and sg.subgroup_id = p.subgroup_id 
left join variation v on v.group_id = sg.group_id and v.subgroup_id = sg.subgroup_id and v.variation_id = p.variation_id 
group by 
1,2 

返回三列,第一个是销售员ID,二是选择让销售子数量目标,第三个是实际销售数量。 即使按第一列和第二列分组,firebird在执行查询时会抛出一个错误:

Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause). 这是什么原因?

+1

http://www.firebirdsql.org/refdocs/langrefupd21-select.html 并参考“子集在聚合函数中” –

+0

@haytem你的意思是“在子查询中聚合函数和GROUP BY项”? – philipxy

回答

4

在选择列表中有一列(不包含在聚合函数或GROUP BY子句中)“。即在inv.salesman_id以外,您在子查询中提到的每一列。这样的列每组有很多值。当存在一个GROUP BY(或者只是一个HAVING,隐式地按所有列进行分组)时,SELECT子句将为每个组返回一行。没有单一的价值可以回报。所以你想(因为你自己把一个答案):

group by 
inv.salesman_id, 
g.group_id, 
sg.subgroup_id, 
v.variation_id 
+0

是的,但这就是为什么我把第一和第二列放在group by子句中,因为他们没有汇总函数来汇总数据。 –

+0

你是对的,我第一次读完之后,我没有完全理解你的答案。请接受编辑以使其更清晰,以便我可以检查您接受的答案并删除我的答案。 –

2

好男人我找到了这个问题的解决方案。

问题是,如果您将在group by子句中的列中有子查询,则此子查询中的参数也必须出现在group by中。所以在这种情况下,我所要做的只是:

group by 
inv.salesman_id, 
g.group_id, 
sg.subgroup_id, 
v.variation_id 

就是这样。希望这有助于未来有人遇到同样的问题。

+0

根据您的需要,您也可以将其包装在另一个选择中,并在该选择中进行求和。 –