【发布时间】:2016-06-21 15:01:52
【问题描述】:
首先我想说我对 SQL 还很陌生,所以这似乎是一个愚蠢的问题。 因此,在这段代码中,我收到一个日期作为参数,向其添加 61 分钟并检查其间的值。 然后我对每一列的值求和并将其存储在另一个表中。 代码工作得很好,我想知道是否有更好的方法和方法。(不使用这么多行或重复的代码)
提前致谢。
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 的评论。
-
这里的另一个问题是您在浮点数上使用 SUM。这表明您希望这些值具有某种精度。 float 数据类型是近似数据类型,不能保存所有值。如果你想要准确,你应该考虑改用十进制或数字。
-
@SeanLange 好的,谢谢,我会仔细阅读。至于变量将数据类型更改为十进制。
标签: sql sql-server stored-procedures query-optimization