首先我想說,我對SQL相當陌生,所以這可能看起來像一個愚蠢的問題。 因此,在此代碼中,我收到一個Date作爲參數,將61分鐘添加到它並檢查兩者之間的值。 然後我總結每列的值並將其存儲在另一個表中。 該代碼工作得很好,我想知道的是,如果有更好的方法來做到這一點,以及如何做到這一點(不使用這麼多的行或重複代碼)需要幫助優化SQL查詢
在此先感謝。
alter procedure Contagem
@date datetime
as
begin
declare
@Sala1 float,
@Sala2 float,
@Sala3 float,
...
@Sala26 float,
@Sala27 float,
@Sala28 float,
@dateplus datetime
set @Teste = 1
set @dateplus = (select DATEADD(MINUTE,61,@date))
set @Sala1 = (select sum(Sala_1_Energia) from Energia_15min where Time_Stamp between @date and @dateplus)
set @Sala2 = (select sum(Sala_2_Energia) from Energia_15min where Time_Stamp between @date and @dateplus)
set @Sala3 = (select sum(Sala_3_Energia) from Energia_15min where Time_Stamp between @date and @dateplus)
...
set @Sala26 = (select sum(Sala_26_Energia) from Energia_15min where Time_Stamp between @date and @dateplus)
set @Sala27 = (select sum(Sala_27_Energia) from Energia_15min where Time_Stamp between @date and @dateplus)
set @Sala28 = (select sum(Sala_28_Energia) from Energia_15min where Time_Stamp between @date and @dateplus)
Insert into Custos_hora values (@date,@Sala1,@Sala2,@Sala3,@Sala4,@Sala5,@Sala6,@Sala7,@Sala8,@Sala9,@Sala10,@Sala11,@Sala12,@Sala13,@Sala14,@Sala15,@Sala16,@Sala17,@Sala18,@Sala19,@Sala20,@Sala21,@Sala22,@Sala23,@Sala24,@Sala25,@Sala26,@Sala27,@Sala28)
end
你真的需要閱讀規範化。你有重複的列,這使得事情變得非常困難。通過將所有變量設置在單個select語句中,而不是一次又一次地敲入同一個表,您當然可以使此更好。但最好的選擇是將這個表完全重構爲一個規範化的表結構。 –
@Dumbrica:目前爲止,你所得到的最佳答案是Sean Lange在我看來的評論。 –
另一個值得關注的問題是你在float上使用SUM。這表明您需要對這些值進行某種精度。 float數據類型是一個近似的數據類型,不能保存每個值。如果你想要的準確性,你應該考慮切換到十進制或數字。 –