2017-12-19 21 views
0

私は、以下に示す表に従ってデータを抽出するために、2つのSQLクエリを持っている:テーブルAを取得するマージ2つのテーブルのデータ - 列ワイズ

====

問合せ:

SELECT :DATE AS Date, A.Tracking_ID AS Number, A.Country, COUNT(EmailID) AS EmailSent 
FROM 
FACT_EMAILS A 
LEFT OUTER JOIN DIM_ACCOUNT B 
ON A.ACCT_ID=B.ACCT_ID 
WHERE A.TIMESTAMP>SYSDATE 
AND A.Tracking_ID IN (‘12345’,’23416’,’7890’) 
GROUP BY :DATE, A.Tracking_ID, A.Country 

クエリを取得するには、表B:

SELECT :DATE AS Date, A.Tracking_ID AS Number, A.Country, COUNT(EmailID) AS EmailResponse 
FROM 
FACT_EMAILS A 
LEFT OUTER JOIN DIM_ACCOUNT B 
ON A.ACCT_ID=B.ACCT_ID 
INNER JOIN DIM_EMAILRESP C 
ON C.Email_Type_ID = A.Email_Type_ID 
WHERE C.Email_Type_ID IN (1,3,5) 
AND A.TIMESTAMP>SYSDATE 
AND A.Tracking_ID IN (‘12345’,’23416’,’7890’,) 
GROUP BY :DATE, A.Tracking_ID, A.Country 

======

背景:電子メール応答があるレコードのみを探しているので、私がテーブルBに入っている出力を得るために使う余分なテーブルが1つあります。このテーブルは、テーブルAのデータを抽出するときに使用されていません。また、データベースにテーブルAとテーブルBがありません。命名は、この例を説明するために使用されます。ここ

私の質問は、私は表A、表Bの両方を組み合わせて、表C.

Table A

Table B

Table C (Output)

として出力を得る誰かが助けてくださいすることができない方法です。

+4

ヒント:LEFT JOIN'。 –

+0

HI Gordon、ソーステーブルのデータを取得するために集計(Count操作を実行して、送信された電子メールの合計数と電子メールの応答数を取得しています)を実行しています。ここで左に参加するにはどうすればいいですか? – Karu3103

+2

あなたが助けが必要な 'queries'を提供しない限り、最良の答えが(@GordonLinoffによって)あなたにすでに提供されています。 –

答えて

1

さんは自分のテーブルAとテーブルBのデータ・ブロックを取り、それらを一緒に参加してみましょう:

SELECT 
    a.date, 
    a.number, 
    a.country, 
    a.EmailSent, 
    COALESCE(b.EmailResponse,0) as EmailResponse 
FROM 
(
SELECT :DATE AS Date, A.Tracking_ID AS Number, A.Country, COUNT(EmailID) AS 
EmailSent 
FROM 
FACT_EMAILS A 
LEFT OUTER JOIN DIM_ACCOUNT B 
ON A.ACCT_ID=B.ACCT_ID 
WHERE A.TIMESTAMP>SYSDATE 
AND A.Tracking_ID IN ('12345','23416','7890') 
GROUP BY :DATE, A.Tracking_ID, A.Country 
) a 

LEFT OUTER JOIN 

( 
SELECT :DATE AS Date, A.Tracking_ID AS Number, A.Country, COUNT(EmailID) AS 
EmailResponse 
FROM 
FACT_EMAILS A 
LEFT OUTER JOIN DIM_ACCOUNT B 
ON A.ACCT_ID=B.ACCT_ID 
INNER JOIN DIM_EMAILRESP C 
ON C.Email_Type_ID = A.Email_Type_ID 
WHERE C.Email_Type_ID IN (1,3,5) 
AND A.TIMESTAMP>SYSDATE 
AND A.Tracking_ID IN ('12345','23416','7890') 
GROUP BY :DATE, A.Tracking_ID, A.Country 

) b 
ON 
a.date = b.date AND 
a.Number = b.number AND 
a.country = b.country 

(...) a内部のすべてが(...) b内部

すべてがB

を生成し、クエリで生成されたクエリであります

2つは共通の列に結合されたままになります。 COALESCEは、EmailsResponseのBに一致する行データがない場合は常に0を入れるために使用されます。私が持っていたので、あなたはすべてのあなたのテーブル構造/関係を投稿していなかった

SELECT 
:DATE AS Date, 
A.Tracking_ID AS Number, 
A.Country, 
COUNT(A.Tracking_ID) as EmailSent, 
COUNT(C.Email_Type_ID) AS EmailResponse 
FROM 
FACT_EMAILS A 
LEFT OUTER JOIN DIM_EMAILRESP C 
ON C.Email_Type_ID = A.Email_Type_ID 
AND C.Email_Type_ID IN (1,3,5) 

WHEREA.TIMESTAMP>SYSDATE 
AND A.Tracking_ID IN ('12345','23416','7890') 
GROUP BY :DATE, A.Tracking_ID, A.Country 

:私はこれはおそらく、はるかに簡単なクエリによって解決できる現実的IN句で

をあなたのグラグラアポストロフィを修正しました何かを推測する。私はBがクエリで不要であったと推測しているように - それは使用されていないようだ。

+0

こんにちはCaius ..このことに感謝します。しかし、私がこれを試してみると、私にEmailSentの列は与えられません。それは私の出力にEmailResponseを与えるだけです。私は私の質問で私の期待された出力ごとにこれらの両方の列を探しています。 – Karu3103

+0

無視します。私はちょうどそれを考え出した。おかげで多くのCaius :) – Karu3103

関連する問題