我有以下查询:
select
fooditemid,
sum(mealsize) as mealsize,
mealdate
from Phase2FoodItems
where`
userid = 190
and mealdate between
(select dietstartdate from Users where userid = 190)
and GETDATE()
group by mealdate
据我所知,这基本上是要求SQL在没有提供足够信息的情况下向我提供数据(它不知道它应该对未在组中指定的列做什么,即总和,平均等)。
不幸的是,将所有其余列添加到组中并不会为mealsize
列提供我正在寻找的总和值。事实上,我得到的数据与我没有得到的数据完全相同。
我想我在这里错过了一个概念,任何人都可以解释和/或建议一个新的sql语句,它将为我提供膳食日列中每个值的饭量列的总和吗?
答案 0 :(得分:2)
由于您使用的是Aggregate
(SUM)函数,因此需要在GROUP BY
子句中指定所有其他列。
select
fooditemid,
sum(mealsize) as mealsize,
mealdate
from Phase2FoodItems
where
userid = 190
and mealdate between
(select dietstartdate from Users where userid = 190)
and GETDATE()
group by mealdate, fooditemid
答案 1 :(得分:1)
如果该列没有出现在group by子句中(例如,在您的情况下为fooditemid
),则select子句中不能有列。如果要保留fooditemid
列,虽然总和为mealsize
,但您可以在子查询中获得此总和。例如:
select
outertable.fooditemid,
outertable.mealdate,
subquery.mealsize
from
Phase2FoodItems outertable
inner join
(
select sum(inner.mealsize) mealsize
from Phase2FoodItems inner
where inner.userid = 190
and inner.mealdate between
(select dietstartdate from Users where userid = 190)
and GETDATE()
group by inner.mealdate, inner.fooditemid
) subquery
on subquery.fooditemid = outer.fooditemid
where
outertable.userid = 190
and outertable.mealdate between
(select dietstartdate from Users where userid = 190)
and GETDATE()
答案 2 :(得分:0)
要分组的所有列都应存在于GROUP BY子句中,以便SQL Server以...开头...其他RDBMS更宽容,并且将返回非聚合列的第一个值而不是错误。
如果您在其中添加了其他列,则发现您的表格具有最精细的粒度级别 - 您需要精确计算出所需的粒度级别,并将这些列添加到GROUP BY和SELECT中,而不是参考SELECT中的其他列。
答案 3 :(得分:0)
GROUP BY
语句与聚合函数结合使用,以按一列或多列对结果集进行分组...
所以这将删除你的错误...
select
fooditemid,
sum(mealsize) as mealsize,
mealdate
from Phase2FoodItems
where`
userid = 190
and mealdate between
(select dietstartdate from Users where userid = 190)
and GETDATE()
group by mealdate, fooditemid
但是,这将按两列分组您的数据,即mealdate& fooditemid ..所以,如果你想要的数据只按用餐日期分组,你可以在下面查询...
Select fooditemid, mealsize,
mealdate from (
Select Row_Number() Over(Partition By Meal Date Order By fooditemid) as Row,
fooditemid,
sum(mealsize) as mealsize,
mealdate
from Phase2FoodItems
where`
userid = 190
and mealdate between
(select dietstartdate from Users where userid = 190)
and GETDATE()) t where Row=1