2011-11-08 18 views
0

することにより、グループの各グループを照会:SQL Serverの - 私はこのようなクエリ持っ

SELECT A, B, C, 
    CASE 
    WHEN 1 = (
       SELECT COUNT(DISTINCT D) 
       FROM MyTable tbl2 
       WHERE tbl2.A = tbl.A AND tbl2.B = tbl.B and tbl2.C = tbl.C 
      ) 
     THEN (
      SELECT AVG(D) 
      FROM MyTable tbl3 
      WHERE tbl3.A = tbl.A AND tbl3.B = tbl.B and tbl3.C = tbl.C 
      ) 
    ELSE SUM(D) 
FROM MyTable tbl 
GROUP BY A, B, C 

は、このクエリを記述するためのより良い方法のいずれかを知っていますか?

私が本当に好きなのは、テーブルを2度再クエリするのではなく、selectステートメントでグループの各グループをクエリすることです。それも可能ですか?

JOINを行うことは可能ですが、グループ化するために一緒に集約されている元の行の各グループを照会することを強くお勧めしたいと思います。

私はSQL Server 2005を実行しています。

ご協力いただきありがとうございます!

EDIT:2011-11-09

質問のいくつかの光で、私ははっきりと十分に私の目標を説明しなかったと思います。

私がグループを行うとき、select文の各グループを構成する行をクエリする方法はありますか? SQLのキーワード/機能はありますか?ここで私が何を意味するかです:

Table: 
| Code | Qty | ColumnA | ColumnB | 
| A | 100 | 3  | 100  | 
| A | 100 | 4  | 200  | 
| A | 0 | 0  | 300  | 
| B | 0 | 0  | 400  | 
| B |100 | 1  | 500  | 

SELECT Code, SUM(ColumnB), 
    (SELECT AVG(ColumnA) FROM Table WHERE Code = tbl.Code AND Qty <> 0) AS ColumnA 
FROM Table tbl 
GROUP BY Code 

私が探している出力は次のとおりです。

| Code | ColumnA | ColumnB | 
| A | 3.5  | 600  | 
| B | 1  | 900  | 

あなたが見ることができるように、私は表に3行を照会することにより、そのネストされたクエリを避けたいのですがAからなるそのグループ。各グループの元の行を表示するSQLキーワードまたは関数を知っていますか?クエリを書く方が良いでしょうか?私はあなたを推測

+0

だけで最高の作品解決策を望むとは対照的に、あなたが「強く」問題への一つの特定のソリューションを好む理由はありますか? –

+1

だから、1があるときに平均を求めたい場合は、合計を欲しいですか?なぜSUMだけではないのですか? – SQLMason

+0

@ダン - それは非常に正しい、1つの別個の値(例えばD = 5のレコード)があるとき、OPは合計(50)の代わりに平均(5)をとっている。数学的にはそれほど意味があるわけではありませんが、投稿内のOPロジックはありません。 – Andrew

答えて

1

は単にたい:

SELECT Code 
    , AVG(CASE WHEN ColumnA<>0 THEN ColumnA ELSE NULL END) AS ColumnA 
    , SUM(ColumnB) AS ColumnB 
FROM Table tbl 
GROUP BY Code 
関連する問題