2009-09-22 6 views
1

J'ai le problème SQL suivant.Groupe Oracle par et l'ensemble résultant vide

Scénario:

J'ai deux tables: Changement et ChangeTicket. Il existe une relation 1: n. Un changement a cero ou beaucoup de changeTickets. Aucun changement ne signifie pas de changement de ticket. Un ticket de change a un statut (ouvert/fermé/...) Un changement de ticket a un champ représentant combien de minutes ont pris ce changement.

Un changement a une entreprise et un mois. Il y a au plus UN changement dans le mois.

Je dois signaler pour une entreprise donnée et pour un mois donné la somme des minutes un changement donné a pris.

J'ai écrit l'instruction SQL suivante.

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 

Ceci est OK.

Si pour le mois donné et la société donnée il n'y a ni changement ni ticket alors j'obtiens une valeur nulle qui est convertie en cero usgin la fonction NVL.

Le problème se pose lorsque je veux regrouper les informations en utilisant le statut. Si j'ajoute une clause de 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 

alors mon résultat est l'ensemble vide. Je comprends qu'il n'y a pas d'état et que l'ensemble résultant est d'une manière ou d'une autre cohérent et qu'un ensemble résultant vide est retourné.

Comment puis-je éviter ce problème. Dans ce cas, je dois signaler un vide état de l'état et cero comme la somme.

(BTW, j'ai aussi essayé de mettre NVL (Change_Ticket.status, 'none') mais ne fonctionne pas)

Merci beaucoup à l'avance.

Luis

Répondre

2

Je pense que pour obtenir ce que vous voulez, vous devez faire ceci:

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

En supposant que vous avez la liste de vos statuts dans une table appelée 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 

ou ce (uniquement si vous utilisez 8i, cette syntaxe est obsolète dans les versions supérieures):

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 

Si vous souhaitez uniquement afficher les statuts existants ou un NULL lorsqu'il n'y a aucun enregistrement, utilisez ceci:

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

Merci pour votre réponse. Malheureusement, je n'ai pas de statut de table.Je n'ai qu'un statut de colonne. Quoi qu'il en soit, je vais essayer de suivre votre idée. Les commentaires sont les bienvenus. – Luixv