SQL Server中具有group by的选择列表中的列无效

时间:2013-06-05 08:38:02

标签: sql sql-server

我有以下查询:

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语句,它将为我提供膳食日列中每个值的饭量列的总和吗?

4 个答案:

答案 0 :(得分:2)

由于您使用的是AggregateSUM)函数,因此需要在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