J'ai une table (JobLog) qui contient des données sur les produits. Je veux être en mesure de vérifier si certains champs ont peut-être été soumis à nouveau et saisis deux fois mais éventuellement traités auparavant.
Mon code est le suivant:
|ProductName | AmtHeld | ProductCode | Disposition| |------------|---------|-------------|------------| | chocolate | 123 | 500 | P | |------------|---------|-------------|------------| | chocolate | 123 | 500 | C | |------------|---------|-------------|------------|
Et il sorties:
|ProductName | AmtHeld | ProductCode | Disposition| |------------|---------|-------------|------------| | chocolate | 123 | 500 | P | |------------|---------|-------------|------------| | chocolate | 123 | 500 | C | |------------|---------|-------------|------------| | vanilla | 355 | A30 | C | |------------|---------|-------------|------------| | vanilla | 355 | A30 | C | |------------|---------|-------------|------------|
Y a-t-il un moyen d'avoir un paramètre supplémentaire où il ne produirait que les lignes qui ont Disposition = P dans la ligne? Comme dans, je ne voudrais que la sortie des deux produits chocolatés car l'un d'eux a une disposition de P mais pas les deux vanille car ils ont tous les deux une disposition de C (il n'y a pas de P).
SELECT A.ProductName, A.ProductCode, A.AmtHeld, A.Disposition FROM JobLog AS A INNER JOIN ( SELECT ProductCode, AmtHeld FROM JobLog GROUP BY ProductCode, AmtHeld HAVING COUNT(*) > 1 ) AS B ON (A.ProductCode = B.ProductCode) AND (A.AmtHeld = B.AmtHeld)
Merci d'avance!
3 Réponses :
Vous pouvez ajouter une clause WHERE EXISTS
à votre requête pour rechercher un produit qui a une valeur Disposition
de P
quelque part dans le tableau :
JOIN JobLog C ON C.ProductCode = A.ProductCode AND C.Disposition = 'P'
Vous pouvez également faire une autre auto-inscription:
WHERE EXISTS (SELECT * FROM JobLog A1 WHERE A1.ProductCode = A.ProductCode AND A1.Disposition = 'P')
Vous pouvez mettre la condition directement dans la clause HAVING
:
SELECT A.ProductName, A.ProductCode, A.AmtHeld, A.Disposition FROM JobLog AS A INNER JOIN (SELECT ProductCode, AmtHeld FROM JobLog GROUP BY ProductCode, AmtHeld HAVING COUNT(*) > 1 AND SUM(IIF(DISPOSITION = 'P', 1, 0)) > 0 ) AS B ON A.ProductCode = B.ProductCode AND A.AmtHeld = B.AmtHeld
Je pense que votre condition peut être satisfaite sans utiliser l'agrégation. Vous pouvez simplement utiliser une condition WHERE EXISTS
pour vous assurer qu'il y a au moins deux enregistrements pour le tuple ProductCode / AmtHeld actuel, et que l'un d'eux a la disposition P.
| ProductName | ProductCode | AmtHeld | Disposition | | ----------- | ----------- | ------- | ----------- | | chocolate | 500 | 123 | P | | chocolate | 500 | 123 | C |This DB Fiddle
avec vos exemples de données renvoie:
SELECT A.ProductName, A.ProductCode, A.AmtHeld, A.Disposition FROM JobLog AS A WHERE EXISTS ( SELECT 1 FROM JobLog B WHERE A.ProductCode = B.ProductCode AND A.AmtHeld = B.AmtHeld AND A.Disposition <> B.Disposition AND (A.Disposition = 'P' OR B.Disposition = 'P') )