2009-07-03 12 views
3

フィールドの合計を選択するSELECTステートメントを作成しようとしていますが、30未満の数値の合計と30以上の数値の合計も返したいと思います。しかし、私はそれをやるための「きちんとした」方法を見つけることを望んでいました。これらの線に沿って30未満の合計と30以上の合計を選択するにはどうすればよいですか?

+1

合計が30に等しい場合は、何も興味がありません。 – pjp

+0

SUMのように行間で合計しますか?あなたは本当に "<> 30"を意味しますか? – gbn

答えて

19

何か(お使いの環境のための構文を訂正):

SELECT 
    sum(case when Field < 30 then Field else 0 end) as LessThan30, 
    sum(case when Field > 30 then Field else 0 end) as MoreThan30 
FROM 
    DaTable 
+0

+1すっきりしています。あなたが必要とするパフォーマンスがあれば、一緒につながったトウの選択肢に勝るものはないと思う。 –

+0

これは、あなたが列にインデックスを持っていると仮定しています。 –

+0

私はこのクエリでパフォーマンスの問題があるとは思わない。別の言い方をすると、2つの別々の選択がより速くなる理由はありません。また、Fieldにインデックスがあり(Fieldがnullでない場合)、このクエリはそのインデックスにアクセスするだけで解決できます。 – Thilo

1

私が正しく理解していれば、あなたは数値を持つ単一の列を持っていて、すべてのTHWのために、このフィールドの合計を見つけたいですフィールド値が30より小さい行、および30より大きいフィールド値の変化を持つ同じ条件。これが正しい場合は、以下のクエリを使用して、それに応じてテーブルとカラム名を再現することができます。

SELECT SUM(CASE  WHEN col1 < 30 THEN COL1  ELSE 0 END 
     ) SUM(CASE  WHEN col1 < 30 THEN COL1  ELSE 0 END 
     ) FROM DATABASE.SCHEMANAME.TABLE 

おかげで、 アトゥール

+0

無視してください、回答はすでにVilxによって投稿されています。アツール – Atul

1

要件は大きな曖昧ですが、私は、行全体でSUMを仮定しますと<> 30これはケースの答えに異なっています。

SELECT 
    SelectCol1, SelectCol2, SelectCol3, ..., SUM(AggregateCol) 
FROM 
    Table 
GROUP BY 
    SelectCol1, SelectCol2, SelectCol3, ... 
HAVING 
    SUM(AggregateCol) <> 30 
関連する問題