2016-12-14 10 views
-3

SQL Serverで実行される次のクエリをOracleに変換する必要があります。SQLクエリの計算フィールド値

SELECT 
    LABEL_A, LABEL_B, 
    CASE 
     WHEN IS_C = '0' AND IS_B = 'S' THEN 'L1' 
     WHEN IS_C = '1' AND IS_B = 'B' THEN 'L1' 
     WHEN IS_C = '0' AND IS_B = 'B' THEN 'L2' 
     WHEN IS_C = '1' AND IS_B = 'S' THEN 'L2' 
    END AS L, 
    QTY 
FROM 
    DATA 
WHERE 
    PRICE > 0 AND E_DATE >= getdate()-1) AS LS 
GROUP BY 
    LABEL_A, LABEL_B, L 
HAVING 
    SUM(QTY/100) >= 150 

私を助けてもらえますか?

ありがとうございました。この行で

+0

あなたが今までに試したこととあなたが持っている問題を投稿してください – Aleksej

+3

そのクエリは実際にSQL Serverで実行されますか? – jarlh

+0

'WHERE'節のタイプミス以外に、' getdate() 'を' sysdate'に置き換えて、あなたはうまくいくはずです。 – gmiley

答えて

3

OracleへのSQL Serverからの移植での主な課題は、後者はSELECT文の別名がGROUP BY句で使用することはできませんということです。しかし、長いCASE式を繰り返す代わりに、サブクエリを使用して再利用することができます。

SELECT t.LABEL_A, 
     t.LABEL_B, 
     t.L, 
     SUM(t.QTY) AS QTY 
FROM 
(
    SELECT LABEL_A, 
      LABEL_B, 
      CASE WHEN IS_C = '0' AND IS_B = 'S' THEN 'L1' 
       WHEN IS_C = '1' AND IS_B = 'B' THEN 'L1' 
       WHEN IS_C = '0' AND IS_B = 'B' THEN 'L2' 
       WHEN IS_C = '1' AND IS_B = 'S' THEN 'L2' 
      END AS L, 
      QTY 
    FROM DATA 
    WHERE PRICE > 0 AND E_DATE >= SYSDATE - 1 
) t 
GROUP BY t.LABEL_A, t.LABEL_B, t.L 
HAVING SUM(t.QTY)/100 >= 150 
+0

これは、内部の 'WHERE'節に匹敵しない') 'カッコが残ります。 – MT0

+0

これは、前の 'WITH'ステートメントを使って' CTE'で行うこともできます。彼らは通常、物を少し読みやすくします。少なくともIMO以上。 – gmiley

+0

@gmiley、そして私はこの派生テーブルを少し読みやすくしています。味のちょうど問題です。 – jarlh

1

WHERE PRICE > 0 AND E_DATE] >= getdate()-1) AS LS 

はここ]を削除し、)(あまりにもMSに無効であると思われるもの)とsysdategetDate()を交換してください。グループはLの代わりにCASEと置き換えてください。

+0

また、where句の中の余分な括弧 ')'もあります。 – gmiley

+0

@gmileyはい私はそれを追加します – Kacper

+0

彼はテキストの 'sysdate'について言及しています、それは上の例にはありません。 – gmiley

3

エラーの大半は、この行では、次のとおりです。

WHERE PRICE > 0 AND E_DATE] >= getdate()-1) AS LS 

あなたは余分な])文字を持っているとgetdate()SYSDATEに置き換えられ、あなたが行の末尾にエイリアスを削除する必要があります。それ以外では、GROUP BY句で列エイリアスを使用することはできず、case文全体を使用する必要があります(またはサブクエリでラップする)必要があります。

QTYGROUP BY句の一部ではないという問題もあります。

SELECT LABEL_A, 
     LABEL_B, 
     CASE 
     WHEN IS_C = '0' AND IS_B = 'S' THEN 'L1' 
     WHEN IS_C = '1' AND IS_B = 'B' THEN 'L1' 
     WHEN IS_C = '0' AND IS_B = 'B' THEN 'L2' 
     WHEN IS_C = '1' AND IS_B = 'S' THEN 'L2' 
     END AS L, 
     SUM(QTY) AS QTY 
FROM DATA 
WHERE PRICE > 0 
AND E_DATE >= SYSDATE-1 
GROUP BY 
     LABEL_A, 
     LABEL_B, 
     CASE 
     WHEN IS_C = '0' AND IS_B = 'S' THEN 'L1' 
     WHEN IS_C = '1' AND IS_B = 'B' THEN 'L1' 
     WHEN IS_C = '0' AND IS_B = 'B' THEN 'L2' 
     WHEN IS_C = '1' AND IS_B = 'S' THEN 'L2' 
     END 
HAVING SUM(QTY/100) >= 150 
+0

GROUP BYのcase式を繰り返すのではなく、派生テーブルでクエリをラップします。 – jarlh

関連する問題