これは、Oracle SQL- Flag records based on record's date vs historyへの投稿に関するもので、これは正常に解決されました。CONCAT機能とLAG機能を組み合わせる
- これは新しい問題です(これは前のトピックに関連していますが)。
- 誰かが元のポストからの解決策を見つけるかもしれないので、私はそれを変更したくありませんでした。
私は現在、(@Mottorによって提供される)次のクエリ実行しています:LAG機能は私がすることができます、私はまた、会計年度2016からのすべてのトランザクションのリストを取得する結果
SELECT
"REGION"
, "COUNTRY"
, "IDNum"
, "CUSTOMER"
, "BUSSINESS"
, "FISCALYEARMONTH"
, "FISCALYEAR"
, SUM("VALUE")
, MAX(CASE WHEN to_date(prev_fym,'YYYYMM') >= ADD_MONTHS (to_date("FISCALYEARMONTH",'YYYYMM'), -24) THEN 'Existing'
ELSE 'New ' END) "HISTORICAL_PURCHASE_FLAG"
FROM
(
SELECT
T1."REGION"
, T1."COUNTRY"
, T1."IDNum"
, T1."CUSTOMER"
, T2."BUSSINESS"
, T3."FISCALYEARMONTH"
, T3."FISCALYEAR"
, T4."VALUE"
, LAG ("FISCALYEARMONTH", 1) OVER (PARTITION BY T1."IDNum" ORDER BY T3."FISCALYEARMONTH" DESC) prev_fym
FROM
"DATABASE"."SALES" T4
, "DATABASE"."CUSTOMER" T1
, "DATABASE"."PRODUCT" T2
, "DATABASE"."TIME" T3
WHERE
T4."CUSTOMERID" = T1."CUSTOMERID"
AND T4."PRODUCTID" = T2."PRODUCTID"
AND T4."DATEID" = T3."DATEID"
AND T1."COUNTRY" IN ('ENGLAND', 'France')
AND T3."FISCALYEAR" IN ('2014','2015','2016')
)
WHERE "FISCALYEAR" IN ('2016')
GROUP BY
"REGION"
, "COUNTRY"
, "IDNum"
, "CUSTOMER"
, "BUSSINESS"
, "FISCALYEARMONTH"
, "FISCALYEAR"
;
を"IDNum"と "FISCALYEARMONTH"に基づいて、 "New"または "Existing"としてフラグレコードを作成します。
LineNum REGION COUNTRY IDNum CUSTOMER BUSSINESS FISCALYEARMONTH FISCALYEAR VALUE HISTORICAL_PURCHASE_FLAG
1 Europe ENGLAND 255 Abraxo Cleaner Co. Chemicals 201605 2016 34,567.00 Existing
2 Europe FRANCE 123 Metal Trade Heavy 201602 2016 12,500.00 Existing
3 Europe ENGLAND 255 Abraxo Cleaner Co. Mining 201601 2016 8,400.00 New
私が現時点で直面しています問題は、単一の顧客が実際には複数の企業に属することができるということです。私は、次の結果を得ます。上記の例を見ると、Abraxo Cleaner Co.がChemicals and Miningに属していることがわかります。
「CUSTOMER_BUSSINESS_KEY」という新しい列を作成しようとしましたが、これは連結であるCONCAT(T1."IDNum",T2."BUSSINESS")
です。
次に、LAG関数を次のように変更したいと考えました。LAG ("FISCALYEARMONTH", 1) OVER (PARTITION BY "CUSTOMER_BUSSINESS_KEY" ORDER BY T3."FISCALYEARMONTH" DESC) prev_fym
。これにより、「IDNum」の代わりに、新しく作成された列に基づいて「New」および「Existing」というフラグが設定されたレコードを取得できます。
問題は、私は、クエリを実行すると、私はというエラーメッセージを取得するには、次のとおりです。
ORA-00904: "CUSTOMER_BUSSINESS_KEY":無効な識別子
私の理解では、SQLは、テーブル名を見つけることができないということです「CUSTOMER_BUSSINESS_KEY」の場合残念ながら、私はそれを回避する方法を見つけることができません。
あなたは別の派生テーブルを追加したり、代わりに計算を使用するか、同じ選択内のエイリアスを使用することはできません
同じSelect内でエイリアスを使用することはできません。しかし、なぜあなたは単純に2つのカラムを使用しないのですか? 'PARTITION BY T1。 "IDNum"、T2。 "BUSSINESS" '? – dnoeth
@a_horse_with_no_name Oracle SQLデータベースを使用しているためです。 – Blase
@dnoeth 2つのテーブルを参照することは私には起こりませんでした。私はLAG( "FISCALYEARMONTH"、1)を超えていました(パーティションID T1。 "IDNum"、T2。 "BUSSINESS" T3。 "FISCALYEARMONTH" DESC)prev_fym'を使ってクエリが実行されています。結果を確認してお知らせします。 – Blase