2017-01-27 166 views
1

我正在尋找一個SQL嚮導來幫助我解決一個小問題,我被告知我的代碼有點不起作用,並且可以通過更好的SQL查詢更好地解決問題,所以首先,這是我現在的代碼。SQL:按日期分組

var days = convertEndDate.Subtract(convertStartDate).TotalDays + 1; 
for (int i = 0; i < days; i++) 
{ 
    var getData = "SELECT (kg*rep*sett) as weight, (kg/max) as avg, (rep*sett) as reps, date FROM Test WHERE date = @0 AND exercise < 4"; 
    var getPeak = "SELECT MAX(kg/max) as peak FROM Test WHERE date = @0 AND exercise < 4"; 
    db.Execute(getData, dt); 
    db.Execute(getPeak, dt); 
    //Resets the value to 0 for next foreach loop. 
    sumKG = 0; 
    totReps = 0; 
    avg = 0; 
    //Adds a day to the date its currently was checking. 
    nextDay = dt.AddDays(1); 
    dt = nextDay; 

    foreach (var c in db.Query(getData, dt)) 
    { 
     var total = c.weight; 
     var reps = c.reps; 
     var calcAvg = c.avg * c.reps; 
     avg += calcAvg; 
     totReps += reps; 
     sumKG += total; 
    } 
    foreach (var d in db.Query(getPeak, dt)) 
    { 
     if (d.peak != null) 
     { 
      peak = d.peak; 
     } 
    } 

    if (sumKG > 0) 
    { 
     var sumKGs = sumKG + "kg"; 
     completeAvg = avg/totReps; 
     <a>@sumKGs, @dt.AddDays(-1).ToString("dd MMM, yyyy"), @completeAvg.ToString("0.#%"), @totReps, @peak.ToString("0.#%")</a> <br /> 

    } 
} 

所以目前這樣做的工作,因爲我想它,但首先我輸入開始日期和結束日期,然後我計算這些天之間的天數,並用其作爲限制在我for循環,即( 1 <日期之間的天數),然後foreach循環獲取第一天的所有數據,然後重複循環,直到for循環達到限制ofc。

但是,在選定日期之間是否有100天,它會運行SQL查詢100次,並且可能有更好的解決方案呢?還有,有兩個查詢,所以它會做一個查詢請求200次,這是因爲我無法弄清楚如何組合2個查詢,甚至不知道它是否有可能在使用MAX(kg/max)當數據庫中可能有許多行包含相同日期時,選擇一個值作爲另一個查詢選擇更多值的位置。

任何人都知道如何做得更好?

PS。不是MVC項目

+1

誰曾告訴過你,這在SQL查詢中會做得更好,他是正確的,在一些示例數據中折騰並讓這個重構。就個人而言,當它涉及到你使用數據集的東西(作爲這個),而不是逐行...我會去SQL ...代碼背後(C#)我更多地用它來逐行計算。 – Veljko89

回答

1

您可以組合查詢。

SELECT 
      SUM(kg*rep*sett) as weight, 
      SUM(kg/max) as avg, 
      SUM(rep*sett) as reps, 
      t.date, 
      pk.peak 
      FROM Test t 
      INNER JOIN (SELECT MAX(kg/max) as peak, date FROM Test WHERE date BETWEEN @0 AND @1 AND exercise < 4 group by date) as pk 
      on t.date = pk.date 
     WHERE t.date BETWEEN @0 AND @1 AND exercise < 4 
GROUP BY t.date, pk.peak 
+0

'在聚合和分組表達式中,SELECT子句只能包含聚合和分組表達式。 [Select clause = pk,peak]' –

+0

這是我得到的錯誤,但是這看起來好像它將是我需要的所有工具!但我在這裏做錯了什麼? –

+0

如果它的相關,即時通訊使用.sdf數據庫,很確定它是SQL Server Compact,在webmatrix,我已經知道不同類型有限制或東西 –

2

正如您所說,可以通過對所需結果進行分組來改進查詢,因爲您只需要求和。第一個查詢必須是:

SELECT 
    sum((kg*rep*sett)) as weight, 
    sum((kg/max)) as avg, 
    sum((rep*sett)) as reps, 
    date 
FROM 
    Test 
WHERE 
    date between @0 and @1 
    AND exercise < 4 
GROUP BY 
    date 

您從等於更改日期爲考取你need.With這一點,你從SQL返回你需要的所有信息的初始和結束日期之間,和u只需要一個for循環將其打印在屏幕上。

+0

這絕對是金!這工作非常好!無論如何,有沒有辦法將我的第二個查詢也納入到這個問題中,即MAX(kg/max)AS peak?而且,人們稱之爲這種SQL魔法,所以我可以讓標題更適合尋找這個的人? –