は、基本的に元のクエリは、フィルタあなたが提出しているレコードを望んでいない状態、REF_NBR =」で、TABLEBとTABLECからいくつかのデータを取得したい:これはメッセージからマニュアルですVALUE '
Timが提案したように、可能な回避策(提案されているように、Teradataへのチケットを発行する間)は、INフィルタ条件を結合で記述することができます。
、このようなクエリのための私の提案は以下の通りです:
SELECT
A.CUSTOMER_CT_KEY,
A.CUSTOMER_ST_KEY,
A.CUSTOMER_TEST_KEY,
SUM(CASE WHEN EXTRACT(MONTH FROM A.DATECOL) = '01'
THEN A.AAA_AMT
ELSE 0
END),
SUM(CASE WHEN EXTRACT(MONTH FROM A.DATECOL) = '02'
THEN A.BBB_AMT
ELSE 0
END),
SUM(CASE WHEN EXTRACT(MONTH FROM A.DATECOL) = '03'
THEN A.CCC_AMT
ELSE 0
END)
FROM TABLEB B
JOIN TABLEC C
ON B.DATECOL<= C.DATECOL
LEFT JOIN (SELECT FS_CUSTOMER_CT_KEY FROM TABLED
WHERE REF_NBR = 'VALUE') AS D
ON B.CUSTOMER_CT_KEY=D.FS_CUSTOMER_CT_KEY
WHERE D.FS_CUSTOMER_CT_KEY is null
GROUP BY 1,2,3;
Dのサブクエリは、フィルタ条件のすべてのレコード(あなたは除外したいもの)を保持しています。 "D.FS_CUSTOMER_CT_KEYがヌル"の条件では、CUSTOMER_CT_KEYがサブクエリDに表示されないレコードだけが結果セットに表示されます。
テスト提案された解決策にいくつかの誤解、実際のOPの要求があったので、私たちはより良いお互いを理解するためにそれを使用できるように、ソリューション
が、私は、基本的なテストケースを用意してみましたソリューションとコーナーケース。
create multiset volatile table TABLEB (
CUSTOMER_CT_KEY BIGINT,
CUSTOMER_ST_KEY BIGINT,
CUSTOMER_TEST_KEY BIGINT,
AAA_AMT decimal(38,18),
DATECOL date
)
no primary index
on commit preserve rows;
create multiset volatile table TABLEC (
DATECOL date
)
no primary index
on commit preserve rows;
create multiset volatile table TABLED (
FS_CUSTOMER_CT_KEY bigint,
REF_NBR VARCHAR(5)
)
no primary index
on commit preserve rows;
insert into tableb (CUSTOMER_CT_KEY, CUSTOMER_ST_KEY, CUSTOMER_TEST_KEY, AAA_AMT, DATECOL)
values (123456789, 541245812, 541245812, 111, '2016-01-15');
insert into tableb (CUSTOMER_CT_KEY, CUSTOMER_ST_KEY, CUSTOMER_TEST_KEY, AAA_AMT, DATECOL)
values (123456789, 541245812, 541245812, 524, '2016-02-15');
insert into tableb (CUSTOMER_CT_KEY, CUSTOMER_ST_KEY, CUSTOMER_TEST_KEY, AAA_AMT, DATECOL)
values (123456789, 541245812, 541245812, 63, '2016-03-15');
insert into tableb (CUSTOMER_CT_KEY, CUSTOMER_ST_KEY, CUSTOMER_TEST_KEY, AAA_AMT, DATECOL)
values (777777777, 111222333, 444555666, 42, '2016-03-15');
insert into tableb (CUSTOMER_CT_KEY, CUSTOMER_ST_KEY, CUSTOMER_TEST_KEY, AAA_AMT, DATECOL)
values (658412457, 632514257, 632514257, 0, '2016-01-15');
insert into tableb (CUSTOMER_CT_KEY, CUSTOMER_ST_KEY, CUSTOMER_TEST_KEY, AAA_AMT, DATECOL)
values (658412457, 632514257, 632514257, 12, '2016-02-15');
insert into tableb (CUSTOMER_CT_KEY, CUSTOMER_ST_KEY, CUSTOMER_TEST_KEY, AAA_AMT, DATECOL)
values (658412457, 632514257, 632514257, 214, '2016-03-15');
insert into tableb (CUSTOMER_CT_KEY, CUSTOMER_ST_KEY, CUSTOMER_TEST_KEY, AAA_AMT, DATECOL)
values (777777777, 999888777, 666555444, 42, '2016-03-15');
insert into tablec (DATECOL)
values ('2016-04-01');
insert into tabled (FS_CUSTOMER_CT_KEY, REF_NBR)
values (777777777, 'VALUE');
insert into tabled (FS_CUSTOMER_CT_KEY, REF_NBR)
values (658412457, 'OK1');
insert into tabled (FS_CUSTOMER_CT_KEY, REF_NBR)
values (658412457, 'OK2');
insert into tabled (FS_CUSTOMER_CT_KEY, REF_NBR)
values (658412457, 'OK3');
select
B.CUSTOMER_CT_KEY,
B.CUSTOMER_ST_KEY,
B.CUSTOMER_TEST_KEY,
SUM(case when extract(MONTH from b.DATECOL)='01' then b.aaa_amt else 0 end) jan_amt,
SUM(case when extract(MONTH from b.DATECOL)='02' then b.aaa_amt else 0 end) feb_amt,
SUM(case when extract(MONTH from b.DATECOL)='03' then b.aaa_amt else 0 end) mar_amt
from tableb b, tablec c
where b.datecol<=c.datecol
and b.CUSTOMER_CT_KEY not in (select FS_CUSTOMER_CT_KEY from TABLED WHERE REF_NBR='VALUE')
group by 1,2,3;
select
B.CUSTOMER_CT_KEY,
B.CUSTOMER_ST_KEY,
B.CUSTOMER_TEST_KEY,
SUM(case when extract(MONTH from b.DATECOL)='01' then b.aaa_amt else 0 end) jan_amt,
SUM(case when extract(MONTH from b.DATECOL)='02' then b.aaa_amt else 0 end) feb_amt,
SUM(case when extract(MONTH from b.DATECOL)='03' then b.aaa_amt else 0 end) mar_amt
from tableb b
inner join tablec c
on b.datecol<=c.datecol
left join TABLED D
ON B.CUSTOMER_CT_KEY=D.FS_CUSTOMER_CT_KEY
AND D.REF_NBR<>'VALUE'
group by 1,2,3;
select
B.CUSTOMER_CT_KEY,
B.CUSTOMER_ST_KEY,
B.CUSTOMER_TEST_KEY,
SUM(case when extract(MONTH from b.DATECOL)='01' then b.aaa_amt else 0 end) jan_amt,
SUM(case when extract(MONTH from b.DATECOL)='02' then b.aaa_amt else 0 end) feb_amt,
SUM(case when extract(MONTH from b.DATECOL)='03' then b.aaa_amt else 0 end) mar_amt
from tableb b
inner join tablec c
on b.datecol<=c.datecol
left join (select FS_CUSTOMER_CT_KEY from TABLED where REF_NBR='VALUE') as D
ON B.CUSTOMER_CT_KEY=D.FS_CUSTOMER_CT_KEY
WHERE D.FS_CUSTOMER_CT_KEY is null
group by 1,2,3;
(偏った、完全に架空の:-)データでは、私は添付の結果を得ました。元のクエリの
シミュレーション最初の提案私の現在の提案の
シミュレーションの
シミュレーション (私はすでに、データが偏っや架空だったことを言いましたよね?: - ))
OPは、揮発性テーブルに挿入するいくつかのフィードバックやいくつかの偽のデータを与えることができますか?
いくつかのサンプルデータとともに完全な選択および挿入ステートメントを含めてください。 –
@TimBiegeleisenあなたの答えをありがとう。 Select文とサンプル出力を含めました。 Date colの内部結合を試みましたが、それは機能しましたが、左の結合は機能しませんでした。私は希望の出力を取得していないとサブクエリ約4~5行を生成します。 – madsthiru
挿入なしの選択は機能しますか? Btw、 'EXTRACT'はINTEGERを返します.'01 'の代わりに' 1'を使うのが良いでしょう。 – dnoeth