我有以下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,'无')但是没有用)
提前多多感谢。
路易斯
答案 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