2013-07-21 52 views
2

我已經編寫了這段代碼來從數據庫中的兩個表中檢索一些信息。但是當我運行它時,出現此錯誤C#中的sql命令錯誤#

列'Eaten_food.Cardserial'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。

代碼:

private void button8_Click(object sender, EventArgs e) 
{ 
     using (SqlConnection con = new SqlConnection(WF_AbsPres_Food.Properties.Settings.Default.DbConnectionString)) 
     { 
      con.Open(); 
      SqlDataAdapter a = new SqlDataAdapter("SELECT Eaten_food.Cardserial , Eaten_food.Date , Eaten_food.Turn , Avb_food_count , Reserve_count from Reserve inner join Eaten_food on Reserve.Cardserial = Eaten_food.Cardserial group by Eaten_food.Date", con); 
      SqlCommandBuilder comdBuilder = new SqlCommandBuilder(a); 
      DataTable t = new DataTable(); 
      //t.Locale = System.Globalization.CultureInfo.InvariantCulture; 
      a.Fill(t); 
      bindingSource3.DataSource = t; 

      /// bind the grid view with binding source 
      Reserve_dataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader); 
      Reserve_dataGridView.ReadOnly = true; 
      Reserve_dataGridView.DataSource = bindingSource3; 

      Reserve_dataGridView.DataSource = t; 
      con.Close(); 
     } 
    } 

我該如何解決呢?

+2

你會期望什麼'GROUP BY'部分的查詢來實現? –

回答

7

問題是你的sql查詢。如果使用Group By,則無法選擇未分組或未彙總的列(即使用Min/Max/Avg/Count)。

所以,你可以把它的工作,例如通過這種方式,在這裏改變你的舊的查詢:

SELECT eaten_food.cardserial, 
     eaten_food.date, 
     eaten_food.turn, 
     avb_food_count, 
     reserve_count 
FROM reserve 
     INNER JOIN eaten_food 
       ON reserve.cardserial = eaten_food.cardserial 
GROUP BY eaten_food.date 

到:

SELECT MIN(eaten_food.cardserial)AS Cardserial, 
     eaten_food.date, 
     MIN(eaten_food.turn) AS Turn, 
     SUM(avb_food_count) AS SumFoodCount, 
     SUM(reserve_count) AS SumReserveCount 
FROM reserve 
     INNER JOIN eaten_food 
       ON reserve.cardserial = eaten_food.cardserial 
GROUP BY eaten_food.date 
1

你有你的SQL語句本身就是一個問題。我會將它複製到SQL管理工作室並進行調試。

組功能是創建彙總行,因爲你的選擇列要麼需要通過條款或類似之statmet的摘要類型爲組的一部分(x)或計數(X)

以下可能工作..

SELECT Eaten_food.Cardserial , 
     Eaten_food.Date , 
     Count(Eaten_food.Turn) , 
     sum(Avb_food_count) , 
     sum(Reserve_count) 
FROM Reserve 
     INNER JOIN Eaten_food ON Reserve.Cardserial = Eaten_food.Cardserial 
GROUP BY Eaten_food.Date, Eaten_food.CardSerial