0

次のように、case 句でグループ化したいクエリがよくあります。

SELECT
    CASE WHEN FIELD IS NULL                     |
    AND (SOMETHING > 100 OR SOMETHINGELSE < 50) |
    AND THATDATE >= add_months(sysdate, -4)     | -> Case
        THEN 0 ELSE 1                           |                                                               
    END AS dim_1,                               |                                                               
    dim_2,
    sum(SOMEFIELD_TOTAL) as measure_1
FROM MY_TABLE
GROUP BY
    CASE WHEN FIELD IS NULL                     | 
    AND (SOMETHING > 100 OR SOMETHINGELSE < 50) | 
    AND THATDATE >= add_months(sysdate, -4)     | -> Same case
        THEN 0 ELSE 1                           |                                                                
    END,                                        |                                                                
    dim_2

ケース全体に対して定義したエイリアスを、のように使用する方法はありgroup byますgroup by dim_1か?

この説明を見つけましたが、それでも、解決策があるかどうか疑問に思っていました。

4

2 に答える 2

3

表現を繰り返すことに過度に関心を持っていると思います。Oracle およびその他の DBMS は、式を重複として認識し、一度だけ計算します。単純に繰り返したくない場合 (単純にカット アンド ペーストするだけです)、派生テーブルまたは共通テーブル式を使用できます。

SELECT 
    dim_1, dim_2, sum(SOMEFIELD_TOTAL) as measure_1
FROM (
    SELECT
        CASE WHEN FIELD IS NULL                     |
        AND (SOMETHING > 100 OR SOMETHINGELSE < 50) |
        AND THATDATE >= add_months(sysdate, -4)     | -> Case
            THEN 0 ELSE 1                           |                                                               
        END AS dim_1,                               |                                                               
        dim_2,
        SOMEFIELD_TOTAL
    FROM MY_TABLE
) AS SQ
GROUP BY
    dim_1, dim_2

見た目はあまり良くありませんよね?

于 2012-10-28T19:24:43.610 に答える
1

subquery factoringknow as named subqueryand も使えますcommon table expression (CTE)(@a_horse_with_no_name さんに感謝)

WITH t as 
(
SELECT
    CASE WHEN FIELD IS NULL                     
    AND (SOMETHING > 100 OR SOMETHINGELSE < 50) 
    AND THATDATE >= add_months(sysdate, -4)     
        THEN 0 ELSE 1 END AS dim_1,         
    dim_2,
    SOMEFIELD_TOTAL as measure_1
FROM MY_TABLE
)
SELECT dim_1, dim_2, sum(SOMEFIELD_TOTAL)
FROM t
GROUP BY dim_1, dim_2

この方法の利点は、通常のサブクエリ (内部選択) のように結合する必要なく、多くのサブクエリを持つことができることです。

于 2012-10-29T05:43:05.930 に答える