首先我想说,我对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数据类型是一个近似的数据类型,不能保存每个值。如果你想要的准确性,你应该考虑切换到十进制或数字。 –