Oracle сгруппировать и пустой результирующий набор - PullRequest
1 голос
/ 22 сентября 2009

У меня следующая проблема SQL.

Сценарий:

У меня есть две таблицы: Change и ChangeTicket. Существует отношение 1: n. Одно изменение имеет несколько или несколько изменений. Отсутствие изменений означает отсутствие изменений. У 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, используя функцию 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 ]

2 голосов
/ 22 сентября 2009

Я думаю, что для достижения того, что вы хотите, вам нужно сделать это:

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 голос
/ 22 сентября 2009

Предполагая, что у вас есть список ваших статусов в таблице с именем 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...