2016-06-21 225 views
1

首先我想说,我对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 
+3

你真的需要阅读规范化。你有重复的列,这使得事情变得非常困难。通过将所有变量设置在单个select语句中,而不是一次又一次地敲入同一个表,您当然可以使此更好。但最好的选择是将这个表完全重构为一个规范化的表结构。 –

+0

@Dumbrica:目前为止,你所得到的最佳答案是Sean Lange在我看来的评论。 –

+0

另一个值得关注的问题是你在float上使用SUM。这表明您需要对这些值进行某种精度。 float数据类型是一个近似的数据类型,不能保存每个值。如果你想要的准确性,你应该考虑切换到十进制或数字。 –

回答

4

您可以按照您目前正在做的那样一次而不是28次地打那张表。

INSERT INTO Custos_hora 
SELECT 
SUM(Sala_1_Energia) 
,SUM(Sala_2_Energia) 
,SUM(Sala_3_Energia) 
,SUM(Sala_4_Energia) 

FROM Energia_15min 

WHERE Time_Stamp between @date and @dateplus 

这被认为是最好的做法,宣布你插入到这样的领域;

INSERT INTO Custos_hora (Field1, Field2, Field3, Field4) 
SELECT 
SUM(Sala_1_Energia) 
,SUM(Sala_2_Energia) 
,SUM(Sala_3_Energia) 
,SUM(Sala_4_Energia) 

FROM Energia_15min 

WHERE Time_Stamp between @date and @dateplus 

另外,什么是变量@Teste?它似乎没有在任何地方使用。而且你似乎也没有宣布@date

+0

忽略@teste,我之前用它来测试一些东西,并忘记删除它。 – Dumbrica

+0

谢谢你的帮助 – Dumbrica

+0

是的,我确定我们都已经在那里用测试代码:)如果这些答案中的任何一个都有帮助,那么请随时注册它们。此外,如果你可以标记为接受的答案,那么将不胜感激。 –

1

你可以做,而不是执行以下操作:

Alter Procedure Contagem (@Date DateTime) 
As Begin 
    Insert Custos_hora 
    Select @Date, 
      Sum(Sala_1_Energia), 
      Sum(Sala_2_Energia), 
      Sum(Sala_3_Energia), 
      Sum(Sala_4_Energia), 
      Sum(Sala_5_Energia), 
      Sum(Sala_6_Energia), 
      Sum(Sala_7_Energia), 
      Sum(Sala_8_Energia), 
      Sum(Sala_9_Energia), 
      Sum(Sala_10_Energia), 
      Sum(Sala_11_Energia), 
      Sum(Sala_12_Energia), 
      Sum(Sala_13_Energia), 
      Sum(Sala_14_Energia), 
      Sum(Sala_15_Energia), 
      Sum(Sala_16_Energia), 
      Sum(Sala_17_Energia), 
      Sum(Sala_18_Energia), 
      Sum(Sala_19_Energia), 
      Sum(Sala_20_Energia), 
      Sum(Sala_21_Energia), 
      Sum(Sala_22_Energia), 
      Sum(Sala_23_Energia), 
      Sum(Sala_24_Energia), 
      Sum(Sala_25_Energia), 
      Sum(Sala_26_Energia), 
      Sum(Sala_27_Energia), 
      Sum(Sala_28_Energia) 
    From Energia_15min 
    Where Time_Stamp Between @Date And DateAdd(Minute, 61, @Date) 
End 
1

多SELECT语句将进行多次表扫描,提高磁盘IO和内存利用率。它可以在单选语句中完成。

alter procedure Contagem 
     @date datetime 

     as 
     begin 


     declare 
     @Sala1 float, 
     @Sala2 float, 
     @Sala3 float, 
     @Sala4 float, 
     @Sala5 float, 
     @Sala6 float, 
     @Sala7 float, 
     @Sala8 float, 
     @Sala9 float, 
     @Sala10 float, 
     @Sala11 float, 
     @Sala12 float, 
     @Sala13 float, 
     @Sala14 float, 
     @Sala15 float, 
     @Sala16 float, 
     @Sala17 float, 
     @Sala18 float, 
     @Sala19 float, 
     @Sala20 float, 
     @Sala21 float, 
     @Sala22 float, 
     @Sala23 float, 
     @Sala24 float, 
     @Sala25 float, 
     @Sala26 float, 
     @Sala27 float, 
     @Sala28 float, 
     @dateplus datetime 

    set @Teste = 1 
    set @dateplus =DATEADD(MINUTE,61,@date)) 

    Insert into Custos_hora 
     select sum(Sala_1_Energia), 
     sum(Sala_2_Energia), 
     sum(Sala_3_Energia), 
     sum(Sala_4_Energia), 
     sum(Sala_5_Energia), 
     sum(Sala_6_Energia), 
     sum(Sala_7_Energia), 
     sum(Sala_8_Energia), 
     sum(Sala_9_Energia), 
     sum(Sala_10_Energia), 
     sum(Sala_11_Energia), 
     sum(Sala_12_Energia), 
     sum(Sala_13_Energia), 
     sum(Sala_14_Energia), 
     sum(Sala_15_Energia), 
     sum(Sala_16_Energia), 
     sum(Sala_17_Energia), 
     sum(Sala_18_Energia), 
     sum(Sala_19_Energia), 
     sum(Sala_20_Energia), 
     sum(Sala_21_Energia), 
     sum(Sala_22_Energia), 
     sum(Sala_23_Energia), 
     sum(Sala_24_Energia), 
     sum(Sala_25_Energia), 
     sum(Sala_26_Energia), 
     sum(Sala_27_Energia), 
     sum(Sala_28_Energia) from Energia_15min where Time_Stamp between @date and @dateplus 
     end