まず、私は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データ型はおおよそのデータ型であり、すべての値を保持することはできません。精度が必要な場合は、代わりに10進数または数値に切り替えることを検討する必要があります。 –