Oracle group by和空结果集

时间:2009-09-22 10:24:25

标签: oracle group-by

我有以下SQL问题。

情景:

我有两个表:Change和ChangeTicket。 有1:n的关系。 One Change有cero或许多changeTickets。 没有变化意味着没有变化门票。 changeTicket具有状态(打开/关闭/ ......) changeTicket有一个字段,表示进行此更改的时间。

变更有公司和一个月。本月最多有一个变化。

我必须报告给定公司以及给定月份的总分钟数 一个给定的改变。

我写了以下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 个答案:

答案 0 :(得分: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 :(得分: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