關於資料倉儲中複雜報表SQL語句的寫法

2021-09-05 05:49:39 字數 1502 閱讀 7512

在資料倉儲的基本報表製作過程中,通常會使用 sql 作為資料來源,可是普通的 sql 實在不適合處理一些較為複雜的邏輯判斷;一般而言,待查詢的資料型別主要包括日期型、數字型、字串這三類資料型別;在報表查詢介面前段,實際上會對查詢的資料作一些預設處理,例如有些欄位可輸可不輸,輸入的字段需要按照輸入的內容進行查詢,而未輸入的字段通常會選擇忽略該條件的存在,如何判斷該欄位是否輸入了呢,當然是針對這些未輸入的字段提供一些預設值了,例如某個數字型別的字段未輸入,則賦乙個預設值 -1 ,某個字串欄位未輸入,則賦乙個預設值為 』 『 ,某個日期未輸入,則賦乙個預設值為 sysdate ;這個時候只要在 sql 中針對不同的預設值和應該輸入的值進行處理就 ok 了。

當然當更加複雜的查詢邏輯實在不適合用 sql 處理時,最好選擇使用儲存過程的方法了;其次過於複雜的 sql 可能會帶來資料庫 效能問題,因此這些基於 sql 的報表最好不要在大型資料表上操作。

下面是構造了乙個包含以上三種資料型別的資料表,並填充了一些測試資料。

create table testreportparameter (

varcharfield    varchar2(20),

numberfield     number(10,0),

datefield       date 

); insert into testreportparameter values('a',1,sysdate-1);

insert into testreportparameter values('b',2,sysdate);

insert into testreportparameter values('c',3,sysdate+2);

insert into testreportparameter values('d',4,sysdate-2);

commit;

處理的秘密在於對預設值和輸入值之間做乙個判斷,保持任何一種值的存在為 true 即可。

對於單值資料的處理比較簡單,參看下面指令碼

select *

from testreportparameter

where (' ' = &varcharfield or varcharfield = &varcharfield)

and (-1 = &numberfield or numberfield = &numberfield)

對於多選值的處理則一定要使用 decode 函式才能避免錯誤的發生,處理的邏輯同上。

select *

from testreportparameter

where (

' '=decode(&varcharfield,' ',' ',&varcharfield)

or varcharfield in (&varcharfield) )

and (

-1=decode(&numberfield,-1,-1,&numberfield)

or numberfield in (&numberfield) ) 

關於MS資料倉儲備份

1 資料倉儲架構備份 包括資料庫的架構和olap的架構 資料庫中包括維表 事實表以及其他臨時或控制類表,其結構通過 生成sql指令碼 來生成。注意 其主鍵 索引等都要生成 olap的架構在預設狀態下儲存在 c program files microsoft analysis services bin...

關於資料倉儲的想法

要能夠把企業的資料從巨集觀到微觀能夠清晰表達,並且能夠實現出來。需要首先有乙個全域性的了解,將整個crm系統進行巨集觀的歸併,得到高層資料檢視,並加以抽象,劃定幾個邏輯的資料主題範圍 然後再對目前需要做的報表所在的主題進行資料分析和主題定義 如果主題還過大還需要進行分解,定義低一級的主題 定義維 度...

資料倉儲中資料粒度

粒度問題是設計資料倉儲的乙個最重要方面。粒度是指資料倉儲的資料單位中儲存資料的細化或綜合程度的級別。細化程度越高,粒度級就越小 相反,細化程度越低,粒度級就越大。確定粒度是資料倉儲開發者需要面對的乙個重要的設計問題。如果資料倉儲的粒度確定合理,設計和實現中的其餘方面就可以非常順暢地進行 反之,如果粒...