1
votes

SQL Sélectionnez les lignes en double avec des valeurs spécifiques

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!


0 commentaires

3 Réponses :


0
votes

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')


0 commentaires

2
votes

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 


0 commentaires

0
votes

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') 
)


0 commentaires