2016-07-07 13 views
0

これは、Oracle SQL- Flag records based on record's date vs historyへの投稿に関するもので、これは正常に解決されました。CONCAT機能とLAG機能を組み合わせる

  1. これは新しい問題です(これは前のトピックに関連していますが)。
  2. 誰かが元のポストからの解決策を見つけるかもしれないので、私はそれを変更したくありませんでした。

私は現在、(@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」の場合残念ながら、私はそれを回避する方法を見つけることができません。

あなたは別の派生テーブルを追加したり、代わりに計算を使用するか、同じ選択内のエイリアスを使用することはできません
+1

同じSelect内でエイリアスを使用することはできません。しかし、なぜあなたは単純に2つのカラムを使用しないのですか? 'PARTITION BY T1。 "IDNum"、T2。 "BUSSINESS" '? – dnoeth

+0

@a_horse_with_no_name Oracle SQLデータベースを使用しているためです。 – Blase

+0

@dnoeth 2つのテーブルを参照することは私には起こりませんでした。私はLAG( "FISCALYEARMONTH"、1)を超えていました(パーティションID T1。 "IDNum"、T2。 "BUSSINESS" T3。 "FISCALYEARMONTH" DESC)prev_fym'を使ってクエリが実行されています。結果を確認してお知らせします。 – Blase

答えて

0

SELECT 
"REGION" 
, "COUNTRY" 
, "IDNum" 
, "CUSTOMER" 
, "BUSSINESS" 
, "CUSTOMER_BUSSINESS_KEY" 
, "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" 
    , CONCAT(T1."IDNum",T2."BUSSINESS") AS "CUSTOMER_BUSSINESS_KEY" 
    , T3."FISCALYEARMONTH" 
    , T3."FISCALYEAR" 
    , T4."VALUE" 
    , LAG ("FISCALYEARMONTH", 1) 
     OVER (PARTITION BY CONCAT(T1."IDNum",T2."BUSSINESS") 
      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" 
; 

をしかし、あなたは、単にパーティション内の複数の列を使用することができます。

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",T2."BUSSINESS" 
      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" 
; 
+0

私はパーティションに複数の列を使用しています。親切にありがとう、それは完全に働いた! – Blase

関連する問題