2016-07-01 4 views
0

Я создал функцию анализа таблицы результатов учащихся. Цель: найти наивысший средний результат, сгруппированный по типу контента. Например:C#: оператор выбора не отображается правильный результат

S_Id  ContentType  Result 
1    T    50 
1    V    70 
1    G    30 
1    G    40 
1    V    60 

Выход, который мне нужен, равен V, поскольку среднее значение V является самым высоким.

Это мой код, но он не отображает правильный результат: Мой выход отображает пятую строку в таблице.

public string analyzeResultTable(string studentId) 
{ 
    string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["AHSConnection"].ToString(); 
    DataSet ds = new DataSet(); 
    DataSet dsAns = new DataSet(); 
    string BestPrefrence = ""; 
    using (MySqlConnection conn = new MySqlConnection(connStr)) 
    { 
     conn.Open(); 
      MySqlCommand cmd2 = 
      new MySqlCommand(
       "Select ContentType, MAX(avgContent) from (select ContentType, AVG(result) as avgContent from dopractice where S_Id='" + 
        studentId + "' GROUP BY ContentType) AS T", conn); 
      MySqlDataAdapter da = new MySqlDataAdapter(cmd2); 
      da.Fill(ds); 
      conn.Close(); 
    } 

    if (ds.Tables[0].Rows.Count > 0) 
    { 
     BestPrefrence = ds.Tables[0].Rows[0]["ContentType"].ToString(); 
    } 
    return BestPrefrence; 
} 
+0

Это не ясно, что это есть * что-то * сделать с C# (хотя вы должны научиться использовать параметризованные SQL). Вы пробовали сделать этот запрос непосредственно в MySQL? –

+0

У меня нет хорошего опыта написания операторов MySql в C# – John

+0

Но проблема не в C# - это с SQL. Сначала запустите свой запрос в инструменте MySQL, а затем переместите его на C# ... и когда вы это сделаете, используйте параметризованный SQL. (Если вы не знаете, как это сделать, просто найдите «параметризованный sql mysql C#», и вы найдете много результатов. –

ответ

0

это Виль дать вам средний результат для каждого ContentType

select ContentType, AVG(result) as avgContent from dopractice where S_Id='" + studentId + "' GROUP BY ContentType order by AVG(result) desc limit 1; 

после добавления заказа вами получите то, что вы хотите

+0

Спасибо за помощь, это работа :) – John

0

ваш запрос не является правильным. Это может быть что-то вроде ниже.

Код

MySqlCommand cmd2 = new MySqlCommand("select ContentType, AVG(Result) as AvgContent 
         from dopractice 
         where S_Id='" + studentId + "' 
         group by ContentType order by 2 desc limit 1;", conn); 

И я настоятельно рекомендую вам использовать параметризованные запросы, чтобы избежать SQL Injection.

Код

MySqlCommand cmd2 = new MySqlCommand("select ContentType, AVG(Result) as AvgContent 
         from dopractice 
         where S_Id= @S_Id 
         group by ContentType order by 2 desc limit 1;", conn); 
cmd2.Parameters.AddWithValue("@S_Id", studentId); 
+0

Спасибо за помощь и советы, это работа :) – John

Смежные вопросы