Dans une application Java à partir d'une base de données Oracle SQL, j'ai le problème suivant pour résoudre:
Une entité DataDelivery
peut être constitué d'un nombre quelconque de Packet
. Packet
a une PacketStatus
et la clé étrangère datadeliveryid
.
PacketStatus
est un Enum avec les valeurs suivantes:
0, processed
1, processing
2, error
3, waiting
La valeur numérique est stockée dans la colonne PacketStatus
dans le tableau PAQUET.
À mon avis, je veux afficher la DataDelivery
sous forme de lignes de table comprenant une colonne qui affiche l'état combiné de tous les paquets se rapportant. L'état combiné des Packets est déterminée selon la logique ci - dessous:
Si tout un paquet appartenant à un DataDelivery a le statut « erreur »: colonne View doit afficher « erreur ».
Si tout un paquet appartenant à un DataDelivery a le statut « d'attente »: colonne View doit afficher « attente ».
Si tous les paquets appartenant à un DataDelivery ont le statut « traité »: colonne View doit afficher « traitée ».
Si tous les paquets appartenant à un DataDelivery le statut « traitement »: colonne View doit afficher un « traitement ».
Si tous les paquets appartenant à un DataDelivery ont soit le statut « traité » ou « traitement »: colonne View doit afficher un « traitement ».
Dans tous les autres cas, la colonne de vue doit afficher: « erreur ».
count
Ignore null
s. Vous pouvez utiliser ce fait pour effectuer une count
sur une case
expression de compter combien de paquets sont dans lesquels le statut. A partir de là, il est une question de coller le tout avec case
s:
SELECT dd.*, status
FROM DataDelivery dd
JOIN (SELECT dataDeliveryId,
CASE WHEN COUNT(CASE status WHEN 2 THEN 1 END) > 0 THEN 'error'
WHEN COUNT(CASE status WHEN 3 THEN 1 END) > 0 THEN 'waiting'
WHEN COUNT(CASE status WHEN 0 THEN 1 END) = COUNT(*) THEN 'processed'
WHEN COUNT(CASE status WHEN 1 THEN 1 END) = COUNT(*) THEN 'processing'
ELSE 'error' END AS status
FROM packet
GROUP BY dataDeliveryId) p ON dd.dataDeliveryId = p.dataDeliveryId