2016-05-26 16 views
1

私はcase文からどのように結果を得、その結果を他のいくつかのcase文でクエリを通して使用しようとしています。 "TransactionDate"を取得する方法、 "Period"、 "BudgetYear"、 "CalendarMonth"、 "CalendarYear"のように動作するはずです。 case文の結果は、それぞれの文で "aila.ACCOUNTING_DATE"がある場所を置き換えます。私はそれぞれのケース・ステートメントの中でケース・ステートメントを試すことを検討していましたが、それは非常に長くなり、より良い方法がなければならないと考えていました。値を取得し、それを複数のcase文で使用する

SELECT 
r.TRANSACTION_ID, 
CASE 
WHEN TRANSACTION_TYPE = 'RECEIVE' 
    THEN r.PRIMARY_QUANTITY * l.UNIT_PRICE 
WHEN TRANSACTION_TYPE = 'RETURN TO VENDOR' 
    THEN -1 * (r.PRIMARY_QUANTITY * l.UNIT_PRICE) 
END AS "Total", 
glcc.SEGMENT5 AS BinNumber, 
CAST(SUBSTR(d.ATTRIBUTE2, -2) AS INT) AS LineNumber, 

CASE 
     WHEN r.PRIMARY_QUANTITY * l.UNIT_PRICE = aila.AMOUNT 
     THEN aila.ACCOUNTING_DATE 
     ELSE (SELECT MAX(ACCOUNTING_DATE) FROM AP_INVOICE_LINES_ALL WHERE d.PO_DISTRIBUTION_ID = PO_DISTRIBUTION_ID) 
    END AS TransactionDate, 

    CASE 
     WHEN EXTRACT(MONTH FROM aila.ACCOUNTING_DATE) >= 9 
     THEN EXTRACT(MONTH FROM aila.ACCOUNTING_DATE) - 8 
     ELSE 
     EXTRACT(MONTH FROM aila.ACCOUNTING_DATE) + 4 
    END AS Period, 
    CASE 
     WHEN EXTRACT(MONTH FROM aila.ACCOUNTING_DATE) >= 9 
     THEN EXTRACT(YEAR FROM aila.ACCOUNTING_DATE) + 1 
     ELSE 
     EXTRACT(YEAR FROM aila.ACCOUNTING_DATE) 
    END AS BudgetYear, 
    EXTRACT(MONTH FROM aila.ACCOUNTING_DATE) AS CalendarMonth, 
    EXTRACT(YEAR FROM aila.ACCOUNTING_DATE) AS CalendarYear, 
    s.VENDOR_ID AS VendorId, 
    s.VENDOR_NAME AS VendorName, 
    h.SEGMENT1 AS PONumber, 
    l.LINE_NUM AS POLineNumber 
FROM 
    RCV_TRANSACTIONS r 
JOIN 
    PO_DISTRIBUTIONS_ALL d 
    ON r.PO_LINE_ID = d.PO_LINE_ID 
JOIN 
    GL_CODE_COMBINATIONS glcc 
    ON d.CODE_COMBINATION_ID = glcc.CODE_COMBINATION_ID 
LEFT OUTER JOIN 
    AP_SUPPLIERS s 
    ON s.VENDOR_ID = r.VENDOR_ID 
LEFT OUTER JOIN 
    PO_HEADERS_ALL h 
    ON h.PO_HEADER_ID = d.PO_HEADER_ID 
LEFT OUTER JOIN 
    PO.PO_LINES_ALL l 
    ON l.PO_LINE_ID = r.PO_LINE_ID 
LEFT OUTER JOIN 
    AP_INVOICE_LINES_ALL aila 
    ON d.PO_DISTRIBUTION_ID = aila.PO_DISTRIBUTION_ID 
    AND r.PRIMARY_QUANTITY * l.UNIT_PRICE = aila.AMOUNT 
WHERE 
    (TRANSACTION_TYPE = 'RECEIVE' or TRANSACTION_TYPE = 'RETURN TO VENDOR') 
AND 
    (glcc.SEGMENT2 = '1070' 
    OR 
    glcc.SEGMENT2 = '1071'); 

答えて

1
あなたが置くことができ

合流してから最初のケースのインライン・ビューまたはCTE(別名共通テーブル式、subquery factoring)で表現し、それを照会 - あなたは、ケース式の列の別名を参照することができます。

WITH CTE AS (
    SELECT 
    r.TRANSACTION_ID, 
    CASE 
    WHEN TRANSACTION_TYPE = 'RECEIVE' 
    THEN r.PRIMARY_QUANTITY * l.UNIT_PRICE 
    WHEN TRANSACTION_TYPE = 'RETURN TO VENDOR' 
    THEN -1 * (r.PRIMARY_QUANTITY * l.UNIT_PRICE) 
    END AS "Total", 
    glcc.SEGMENT5 AS BinNumber, 
    CAST(SUBSTR(d.ATTRIBUTE2, -2) AS INT) AS LineNumber, 
    CASE 
     WHEN r.PRIMARY_QUANTITY * l.UNIT_PRICE = aila.AMOUNT 
     THEN aila.ACCOUNTING_DATE 
     ELSE (SELECT MAX(ACCOUNTING_DATE) FROM AP_INVOICE_LINES_ALL WHERE d.PO_DISTRIBUTION_ID = PO_DISTRIBUTION_ID) 
    END AS TransactionDate, 
    s.VENDOR_ID AS VendorId, 
    s.VENDOR_NAME AS VendorName, 
    h.SEGMENT1 AS PONumber, 
    l.LINE_NUM AS POLineNumber 
    FROM 
     RCV_TRANSACTIONS r 
    JOIN 
     PO_DISTRIBUTIONS_ALL d 
     ON r.PO_LINE_ID = d.PO_LINE_ID 
    JOIN 
     GL_CODE_COMBINATIONS glcc 
     ON d.CODE_COMBINATION_ID = glcc.CODE_COMBINATION_ID 
    LEFT OUTER JOIN 
     AP_SUPPLIERS s 
     ON s.VENDOR_ID = r.VENDOR_ID 
    LEFT OUTER JOIN 
     PO_HEADERS_ALL h 
     ON h.PO_HEADER_ID = d.PO_HEADER_ID 
    LEFT OUTER JOIN 
     PO.PO_LINES_ALL l 
     ON l.PO_LINE_ID = r.PO_LINE_ID 
    LEFT OUTER JOIN 
    AP_INVOICE_LINES_ALL aila 
    ON d.PO_DISTRIBUTION_ID = aila.PO_DISTRIBUTION_ID 
    AND r.PRIMARY_QUANTITY * l.UNIT_PRICE = aila.AMOUNT 
    WHERE 
     (TRANSACTION_TYPE = 'RECEIVE' or TRANSACTION_TYPE = 'RETURN TO VENDOR') 
    AND 
     (glcc.SEGMENT2 = '1070' 
     OR 
     glcc.SEGMENT2 = '1071') 
) 
SELECT 
    TRANSACTION_ID, 
    "Total", 
    BinNumber, 
    LineNumber, 
    TransactionDate, 
    CASE 
     WHEN EXTRACT(MONTH FROM TransactionDate) >= 9 
     THEN EXTRACT(MONTH FROM TransactionDate) - 8 
     ELSE 
     EXTRACT(MONTH FROM TransactionDate) + 4 
    END AS Period, 
    CASE 
     WHEN EXTRACT(MONTH FROM TransactionDate) >= 9 
     THEN EXTRACT(YEAR FROM TransactionDateE) + 1 
     ELSE 
     EXTRACT(YEAR FROM TransactionDate) 
    END AS BudgetYear, 
    EXTRACT(MONTH FROM TransactionDate) AS CalendarMonth, 
    EXTRACT(YEAR FROM TransactionDate) AS CalendarYear, 
    VendorId, 
    VendorName, 
    PONumber, 
    POLineNumber 
    FROM 
    CTE; 

したがって、CTEクエリは、最初のクエリから、aila.ACCOUNTING_DATEを参照した4つの式を除いたものです。そしてCTEに対するクエリはそれからすべての列を取得し、それらの4つの式を追加しますが、代わりにTransactionDateを参照します。

+0

完璧!ありがとうございました!!! – Derek

1

これはAlexの答えに対するコメントですが、コメントではコードの適切な書式設定ができません。

以下のCASE式の使用は、いくらか簡略化することができます。代わりに

CASE 
    WHEN TRANSACTION_TYPE = 'RECEIVE' 
    THEN r.PRIMARY_QUANTITY * l.UNIT_PRICE 
    WHEN TRANSACTION_TYPE = 'RETURN TO VENDOR' 
    THEN -1 * (r.PRIMARY_QUANTITY * l.UNIT_PRICE) 
    END AS "Total", 

のあなたも

CASE TRANSACTION_TYPE 
    WHEN 'RECEIVE'   THEN r.PRIMARY_QUANTITY * l.UNIT_PRICE 
    WHEN 'RETURN TO VENDOR' THEN -1 * (r.PRIMARY_QUANTITY * l.UNIT_PRICE) 
    END AS "Total", 

アレックスはcase式を "検索" を使用書くことができます。私が上に示したものは、「シンプルな」ケース表現と呼ばれています。 Oracleのマニュアル:https://docs.oracle.com/cd/B28359_01/server.111/b28286/expressions004.htm

関連する問題