2010-10-22 130 views
1

嘿傢伙, 所以我有這個報告,我分爲不同的年齡段。如果沒有與此年齡段相關聯的行,我希望年齡段的計數爲零。所以我在我的數據庫選擇中做了一個外連接,並且工作正常。但是,我需要根據數據庫中的另一列添加一個組。水晶報告零值

當我添加這個組時,沒有與它們關聯的行的agebuckets消失。我認爲這可能是因爲我試圖組合的列對於那一行是空的,所以我給我的選擇添加了一個行號,然後按這個分組(我基本上只需要按每行進行分組,而且我可以只是把它放在細節中......如果需要,我可以更多地解釋這一點)。但是在添加行號後,沒有數據的agebuckets仍然是空的!當我刪除我添加的這個組時,我會得到所有年齡段的桶。

任何想法?謝謝!!

+0

只包括分組方案在瑞奇集團的單行是不尋常的。我想知道爲什麼你需要它 - 也許會有線索。另外,看看有沒有新組的Crystal生成的SQL - 查看是否有任何差異可以解釋缺失的行。 – Ray 2010-10-22 21:49:53

回答

2

這是因爲外部聯接年齡組是不是也是一個外連接到任何你的其他 組是 - 你只保證有每個數據集各年齡組中的一個,而不是按各年齡組的一個[其他組]。

因此,例如,如果您的其他組爲Region,則需要從年齡段表到地區表的笛卡爾/交叉連接(以便您可以獲得年齡範圍和地區的所有可能組合)到你的數據集的其餘部分。

編輯 - 基於的評論,類似下面的查詢應該工作:

select date_helper.date_description, c.case_number, e.event_number 
from 
(select 0 range_start, 11 range_end, '0-10 days' date_description from dual union 
select 11, 21, '11-20 days' from dual union 
select 21, 31, '21-30 days' from dual union 
select 31, 99999, '31+ days' from dual) date_helper 
cross join case_table c 
left outer join event_table e 
on e.event_date <= date_helper.range_start*-1 + sysdate 
and e.event_date > date_helper.range_end*-1 + sysdate 
and c.case_number = e.case_number 

(假設它是一個需要分組到桶中的活動日期。)

+0

嗨馬克, 你回答我所有的水晶問題!除了交叉連接之外還有其他解決方案嗎?數據集非常大,交叉連接可能不可行。 – ntsue 2010-10-25 12:40:41

+0

@ntsue,嗨!請你可以包含更多關於[其他組]的細節,如行數,派生等?我通常希望交叉連接年齡範圍 - [其他組]要比要加入的數據集小得多。進一步的細節可能會闡明替代方法(如亞當的或者使用子報告)是否更合適。 – 2010-10-25 12:56:06

+0

嗨。另一組是我的表的主鍵。我根據表的主鍵(案例編號)進行分組的原因,而不是簡單地將其放在我的報告的詳細信息中,因爲我使用案例號來連接到另一個表(它不是主鍵) 。所以另一個表可能有列,「案件號碼」和「事件」,其中「案件號碼」不是唯一的。我基本上想要抓住與該案例號碼相關的最後一個「事件」,並且我通過按案例編號進行分組並完成了此項工作,並顯示了頁腳中的信息而不是詳細信息。 – ntsue 2010-10-25 13:59:31

1

我很難理解你的問題。

我知道水晶報表的NULL支持缺乏一些非常基本的方法。所以我通常不會依賴它。要解決這個問題

一種方式是在數據庫查詢硬編碼的年齡範圍,例如:

SELECT p.person_type 
     , SUM(CASE WHEN 
       p.age <= 2 
       THEN 1 ELSE 0 END) AS "0-2" 
     , SUM(CASE WHEN 
       p.age BETWEEN 2 AND 18 
       THEN 1 ELSE 0 END) AS "3-17" 
     , SUM(CASE WHEN 
       p.age >= 18 
       THEN 1 ELSE 0 END) AS "18_and_over" 
    FROM person p 
GROUP BY p.person_type 

這種方式,你一定會得到你想要零點零。

我意識到這不是對您的問題的直接回答。祝你好運。