2013-06-05 54 views
0

我有以下查詢:無效的列在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給我的數據沒有提供足夠的信息,(不知道是什麼它應該處理未在組中指定的列,即總和,平均值等)。

不幸的是,將所有其餘列添加到組中並沒有給出我正在查找的sum'd值,對於mealsize列。實際上,我得到的數據與沒有總和和分組的數據完全一樣。

我覺得我在這裏錯過了一個概念,任何人都可以解釋和/或建議一個新的SQL語句,它會讓我在mealdate列中的每個值的飯食總和?

+0

現在,這個查詢將不會執行 - fooditemid既不聚合也不分組。 –

回答

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 
+0

是的,我明白這一點。我不明白的是,爲什麼,在將fooditemid添加到組中後,它不會執行SUM或分組......我從這得到的數據與我得到的數據完全相同,如果我沒有與SUM或羣組打擾 – Ortund

0

所有列由分組應該出現在你的GROUP BY子句SQL服務器開始......其他RDBMS是更多的寬容和將返回第一個值非agregated柱代替示數的。

在您添加其他列的過程中,發現您已達到表格所保持的最佳粒度級別 - 您需要計算出所需的粒度級別,並將這些列添加到GROUP BY和SELECT中,而不是參考到你SELECT中的其他列。

+0

這就是爲什麼我更喜歡mysql大聲笑 – Ortund

+0

在許多方面,我同意你 - 我每天都使用這兩種方式,但我看到很多人遇到這種情況,我想我更喜歡更嚴格的要求SQL服務器讓你堅持:-) –

+0

似乎我的解決方案比這些答案更簡單,但這是我的錯。選擇了「fooditemid」後,我給人的感覺是我真的需要它。將它從我的選擇中刪除後,查詢只能通過「由mealdate」組進行操作 – Ortund

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..So如果你想只吃飯日期比你可以試試下面的查詢通過分組數據...

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 
1

SELECT子句中不能有一列,如果t列不出現在group by子句中(即, fooditemid在你的情況。)如果你想保留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()