2009-09-22 4 views
1

У меня есть следующая проблема SQL.Группа Oracle и пустой результирующий набор

Сценарий:

У меня есть две таблицы: Изменение и ChangeTicket. Существует соотношение 1: n. У одного Изменить есть cero или many changeTickets. Без изменений нет изменений. У измененияTicket есть статус (открыт/закрыт/...) У changeTicket есть поле, представляющее, сколько минут прошло это изменение.

A Изменилось предприятие и месяц. В течение месяца происходит ТОЛЬКО одно изменение.

Я должен отчитываться за данную компанию и за данный месяц сумму минут Данное изменение было принято.

Я написал следующий оператор 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, 'None') но не работает)

Спасибо большое заранее.

Луис

ответ

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