2017-02-07 38 views
0

sale_Dt基準に対して4つの問合せが設定されており、1つの問合せに統合したいと考えています。Oracle SQL Developerの動的変数

DEFINE SALE_DT = 20DEC2016; 

Select 
STORE_ID, 
SALES_FINAL_DT, 
SUM(SALES) AS TOTAL_sALE 
From SALES_DB 
Where SALES_FINAL_DT = '&SALE_DT' 
GROUP BY STORE_ID, SALES_FINAL_DT 

私はSALE_DTsale_dt = 20dec2016sale_dt - 7sale_dt - 8sale_dt - 30ためsale_Dtをループ動的変数を作成したいと思います。

私はクエリで販売日を指定します。

提案がありますか?

答えて

2

あなたは例えば、日に4つのバリエーションを指定するORまたはIN句を使用することができます。

DEFINE SALE_DT = 20DEC2016; 

select STORE_ID, SALES_FINAL_DT, SUM(SALES) AS TOTAL_SALE 
from SALES_DB 
where SALES_FINAL_DT = TO_DATE('&SALE_DT', 'DDMONYYYY', 'NLS_DATE_LANGUAGE=ENGLISH') 
or SALES_FINAL_DT = TO_DATE('&SALE_DT', 'DDMONYYYY', 'NLS_DATE_LANGUAGE=ENGLISH') - 7 
or SALES_FINAL_DT = TO_DATE('&SALE_DT', 'DDMONYYYY', 'NLS_DATE_LANGUAGE=ENGLISH') - 8 
or SALES_FINAL_DT = TO_DATE('&SALE_DT', 'DDMONYYYY', 'NLS_DATE_LANGUAGE=ENGLISH') - 30 
group by STORE_ID, SALES_FINAL_DT; 

あなたはまた、わずかにそれを簡素化するために全体to_date()表現置換変数を行うことができます。

DEFINE SALE_DT = TO_DATE('20DEC2016', 'DDMONYYYY', 'NLS_DATE_LANGUAGE=ENGLISH') 

select STORE_ID, SALES_FINAL_DT, SUM(SALES) AS TOTAL_SALE 
from SALES_DB 
where SALES_FINAL_DT = &SALE_DT 
or SALES_FINAL_DT = &SALE_DT - 7 
or SALES_FINAL_DT = &SALE_DT - 8 
or SALES_FINAL_DT = &SALE_DT - 30 
group by STORE_ID, SALES_FINAL_DT; 
それも短くする

または米国IN

select STORE_ID, SALES_FINAL_DT, SUM(SALES) AS TOTAL_SALE 
from SALES_DB 
where SALES_FINAL_DT in (&SALE_DT, &SALE_DT - 7, &SALE_DT - 8, &SALE_DT - 30) 
group by STORE_ID, SALES_FINAL_DT; 

to_date()コールにNLSデータ言語パラメータを含めました。セッションでは'DEC'を理解すると仮定する文字列を使用しているためです。数値形式を使用する場合は、その必要はありません。

DEFINE SALE_DT = TO_DATE('2016-12-20', 'YYYY-MM-DD') 

またはANSI日付リテラルとして:

DEFINE SALE_DT = DATE '2016-12-20' 
+0

おかげでアレックス、これは超便利です。好奇心の念から、where句に/ OR演算子を使用する以外にいくつか(&SALE_DT - number)があった場合、これをどのように扱うのでしょうか?ループを使ってどうすればいいですか? ... –

+0

@Aussie_Stats - ループを使用することは本当に意味をなさない。 PL/SQLを使用し、結果セットを何らかの形で(コレクションを介して)結合する必要があります。それは扱いにくく、非効率的です。インラインビューまたはCTEを使用してさまざまなオフセットを生成し、それをあなたの実際のテーブルに結合することはできますが、それがあなたに多くの利益をもたらすかどうかはわかりません。 –

+0

ありがとう、非常に役立ちます。 –

関連する問題