2016-08-18 3 views
0

私は以下のような状況があります:1ヶ月以内に1回の取引をカウントしてください

私は2つのデータベーステーブルを持っています。私がTB1と呼ぶ最初のテーブルには、顧客が&を信用したすべての給与と、取引が行われた日が含まれています。 私がTB2と呼ぶ2番目のテーブルには、クライアントが銀行に持っているすべての製品が含まれています。 私の目的は、顧客が私たちの銀行の商品(私の場合はオーバーラン)を受け取った日までに得た給与の数を見つけることです。 これまではすべて正常に動作し、必要なデータを抽出するためのクエリを作成しました。 唯一の問題は、クエリを改善する必要があることです。したがって、特定のクライアントが同じ年の同じ月に1つ以上の給与(たとえば15日ごと)を受け取った場合、給与は1回だけカウントされます。 どうすればいいですか?

問合せは、下記のようなものです:

SELECT TB1.customer_id, COUNT(TB1.customer_id) 
FROM table_1 TB1 
JOIN 
(SELECT TB2.CUSTOMER_ID, TB2.OD_START_DATE 
    FROM table_2 TB2 
    JOIN table_2 TB2_MAX 
    ON TB2.CUSTOMER_ID = TB2_MAX.CUSTOMER_ID 
    HAVING TB2.od_start_date = MAX(TB2.od_start_date) 
    GROUP BY TB2.customer_id, TB2.od_start_date 
) TB2 
ON TB1.CUSTOMER_ID = TB2.CUSTOMER_ID 
WHERE TB1.DATE_FROM < TB2.OD_START_DATE 
GROUP BY TB1.CUSTOMER_ID 

PS:OD_START_DATEフィールドは、最新の製品が開かれた日付が含まれていながら、DATE_FROMフィールドは、取引が行われた日付が含まれています。

答えて

1

内部クエリのJOINは冗長です。顧客ごとにMAXの日付が必要です。 外部クエリでは、Customer_IdではなくDATE_FROMを数えてください。 1か月の取引では1回しかカウントしないので、DATE_FROMを年の月の組み合わせに変換し、DISTINCTを使用して1回だけカウントします。

SELECT TB1.customer_id, COUNT(DISTINCT TO_CHAR(TB1.DATE_FROM,'YYYYMM')) 
FROM table_1 TB1 
JOIN 
(SELECT CUSTOMER_ID, MAX(OD_START_DATE) AS OD_START_DATE 
    FROM table_2 
    GROUP BY customer_id 
) TB2 
ON TB1.CUSTOMER_ID = TB2.CUSTOMER_ID 
WHERE TB1.DATE_FROM < TB2.OD_START_DATE 
GROUP BY TB1.CUSTOMER_ID 
+0

ノエルは、私はあなたが言った正確な事をしなかったが、COUNT(DISTINCT TO_CHAR(TB1.DATE_FROM、「YYYYMM」)は)私の命を救っありがとう:) SO MUCHをありがとう – Marin

+0

することができますしてください私にそれをする方法を教えてください?私は解決策に投票しました。 – Marin

+0

答えの横の目盛りをクリックするだけです。 http://stackoverflow.com/help/someone-answers – Noel

関連する問題