2011-07-13 8 views
2

SQL Server 2005でクエリを実行しています。クエリには、同じ番号からなる列が必要です。この数値は、クエリの別の行の平均です。ここに私が持っているものがあります、多分それは私が何をしようとしているのかを理解するのに役立ちます。このクエリーを読み取るソフトウェアがチャートを吐き出しているため、このデータには「カラー」値と「DataExtraLineValue」が完全にダウンしています。基本的には、なぜカント私はグループ化がありませんので、あなたはそれを行うことはできませんDataExtraLineValueAVGの結果をAS列に設定する

SELECT 
     RecordedDateTime AS DataGroup, 
     TagValueInteger AS DataBar, 
     TagValueInteger AS DataLine, 
     'Green' AS DataColor, 
     'Avg' AS DataExtraLineLabel, 
     AVG(TagValueInteger) AS DataExtraLineValue, 
     'Blue' AS DataExtraLineColor 
FROM tTagHistory 
WHERE 
     (TagHistoryDefinitionID = 2) AND 
     (IsQualityGood = 1) AND 
     (DeltaValueInteger <> 0) AND 
     (TagValue > 4) AND 
     (TagValue < 60) AND 
     (RecordedDateTime > (GetDate()-2)) 
ORDER BY RecordedDateTime DESC 

答えて

4

AS AVG(TagValueInteger)を実行します。グループ化しないと、AVGは各行の値になります。あなたがテーブル全体のために、そのフィールドのすべての値の平均をしたい場合は、それサブクエリ作ることができます。それを行うには

SELECT .... 
     (SELECT AVG(TagValueInteger) FROM tTagHistory) as DataExtraLineValue 
     .... 
+0

これは完璧です。サブクエリは私が必要とするものです。なぜなら、同じ値が必要なのですから!ありがとう! –

+0

@Jake - 喜んで助けてください。集約には注意してください! – JNK

1

もう一つの方法は、それほどのようなものです:

SELECT 
    ....  
    AVG(TagValueInteger) over() AS DataExtraLineValue 
    .... 
1

AVGは集合体であります関数。集約関数を使用することは、グループ化を意味します。行セット全体またはグループ内の値を集計します。前者の場合は、集計されていない列(例えば、'Green''Avg'などの静的な値を除く)を持つことはできません。後者の場合は、グループを定義するすべての列をリストするGROUP BY句を導入する必要があります。 SELECTリストに集計されません。あなたのクエリは、いくつかの非凝集値を持っていないので、それは可能性が高い後者の場合だと、クエリは次のようsomehtingになります:

SELECT 
     RecordedDateTime AS DataGroup, 
     TagValueInteger AS DataBar, 
     TagValueInteger AS DataLine, 
     'Green' AS DataColor, 
     'Avg' AS DataExtraLineLabel, 
     AVG(TagValueInteger) AS DataExtraLineValue, 
     'Blue' AS DataExtraLineColor 
FROM tTagHistory 
WHERE 
     (TagHistoryDefinitionID = 2) AND 
     (IsQualityGood = 1) AND 
     (DeltaValueInteger <> 0) AND 
     (TagValue > 4) AND 
     (TagValue < 60) AND 
     (RecordedDateTime > (GetDate()-2)) 
GROUP BY RecordedDateTime, TagValueInteger 
ORDER BY RecordedDateTime DESC 

しかし、それがさらに可能性がありますあなたのポストごとにあなたがしたいこと集計値と非集計値の両方を取得します。その場合、ウィンドウ化された集約が必要です。集計された関数は、OVER clauseを追加してウィンドウの集約関数になります。あなたの特定のケースでは、それはおそらく、このようにする必要があります:

SELECT 
     RecordedDateTime AS DataGroup, 
     TagValueInteger AS DataBar, 
     TagValueInteger AS DataLine, 
     'Green' AS DataColor, 
     'Avg' AS DataExtraLineLabel, 
     AVG(TagValueInteger) OVER() AS DataExtraLineValue, 
     'Blue' AS DataExtraLineColor 
FROM tTagHistory 
WHERE 
     (TagHistoryDefinitionID = 2) AND 
     (IsQualityGood = 1) AND 
     (DeltaValueInteger <> 0) AND 
     (TagValue > 4) AND 
     (TagValue < 60) AND 
     (RecordedDateTime > (GetDate()-2)) 
ORDER BY RecordedDateTime DESC 

AVG(TagValueInteger) OVER()全体の行セットあたりTagValueIntegerの平均値を返します。あるいは、OVER()句を変更して、異なるグループごとに異なる(おそらく繰り返し)値を返すことができます。たとえば、`AVG(TagValueInteger) OVER (PARTITION BY DataGroup)は異なる値の異なる平均値を返します。DataGroup。あなたはリンクされた記事でそれについてもっと読むことができます。

関連する問題