2009-09-22 98 views
1

我有以下的SQL問題。Oracle group by和空結果集

場景:

我有兩個表格:Change和ChangeTicket。 有1:n的關係。一個改變有cero或許多改變票。 沒有改變意味着沒有改變票。 changeTicket有一個狀態(打開/關閉/ ...) changeTicket具有一個字段,表示多長時間進行此更改。

A Change有一個公司和一個月。本月最多隻有一次更改。

我必須報告給定的公司和給定的月份總和分鐘 給定的變化。

我寫了下面的SQL語句。

select nvl(sum(service_req), 0) as SUM_REQ 
from Change_Ticket, Change 
where Change.company_id (+) = '0' 
    and Change.month (+)='07' 
    and Change.Id (+) = Change_Ticket.Change_Id 

這是好的。

如果對於給定的月份和給定的公司,既沒有變化也沒有票 然後我得到一個空值,它被轉換爲cero usgin NVL函數。

當我想使用狀態對信息進行分組時,會出現問題。 如果我添加一個GRUP條款

select Change_Ticket.status, nvl(sum(service_req), 0) as SUM_REQ 
from Change_Ticket, Change 
where Change.company_id (+) = '0' 
    and Change.month (+)='07' 
    and Change.Id (+) = Change_Ticket.Change_Id 
group by Change_Ticket.status 

那麼我的結果是空集。 我明白,沒有狀態,然後得到的集合是 以某種方式一致,然後返回一個空的結果集。

我該如何避免這個問題。在這種情況下,我需要報告一個 空狀態cero作爲總和。

(順便說一句,我也試圖把NVL(Change_Ticket.status, '無'),但沒有工作)

非常感謝提前。

路易斯

回答

2

我覺得達到你想要你需要做這算什麼:

select Change_Ticket.status, nvl(sum(service_req), 0) as SUM_REQ 
from Change_Ticket, Change 
where Change.company_id (+) = '0' 
    and Change.month (+)='07' 
    and Change.Id (+) = Change_Ticket.Change_Id 
group by Change_Ticket.status 
union all 
select '' as STATUS, 0 as SUM_REQ 
from dual 
where not exists (select null from Change_ticket) 
1

假設你有一個名爲statuses你的狀態的一個表中的列表:

SELECT statuses.id, nvl(sum(service_req), 0) as SUM_REQ 
FROM statuses 
LEFT JOIN 
     Change 
ON  Change.company_id = '0' 
     AND Change.month = '07' 
     AND Change.status = statuses.id 
LEFT JOIN 
     Change_Ticket 
ON  Change_Ticket.Change_Id = Change.Id 
GROUP BY 
     statuses.id 

或本(僅當您使用8i,這句法在更高版本不建議使用):

SELECT statuses.id, nvl(sum(service_req), 0) as SUM_REQ 
FROM statuses, Change, Change_Ticket 
WHERE Change.company_id(+) = '0' 
     AND Change.month(+) = '07' 
     AND Change.status(+) = statuses.id 
     AND Change_Ticket.Change_Id(+) = Change.Id 
GROUP BY 
     statuses.id 

如果您只想顯示現有狀態或在沒有記錄時顯示NULL,請使用:

SELECT statuses.id, nvl(sum(service_req), 0) as SUM_REQ 
FROM dual 
LEFT JOIN 
     Change 
ON  Change.company_id = '0' 
     AND Change.month = '07' 
LEFT JOIN 
     Change_Ticket 
ON  Change_Ticket.Change_Id = Change.Id 
GROUP BY 
     statuses.id 
+0

謝謝您的回答。不幸的是我沒有表格狀態。我只有一個列狀態。無論如何,我會盡量按照你的想法。歡迎評論。 – Luixv 2009-09-22 11:03:15