-1
votes

Compter des doublons lorsque vous utilisez l'opérateur "dans"

Je pense que j'ai réduit ma requête à un exemple facile à comprendre ici: xxx

mon problème est-ce - Parfois, le même produit sera retourné plusieurs fois. Mais à cause de la nature de l'opérateur "In", il ne serait compté qu'une fois par la fonction "somme (coût)". Quelle est la meilleure façon de gérer cela? Merci!


9 commentaires

S'il vous plaît fournir des données de base? Vous pouvez l'écrire ici: SQLFIDDLE.COM/#!7


Utilisez non dans mais la jointure interne à la place.


Vous pouvez également appliquer distinct à prod_id dans la requête intérieure


(1) Votre requête ne renvoie pas prod_id , de sorte que votre observation n'a pas de sens. (2) Votre requête revient exactement une rangée, donc il n'y a pas de doublons. Votre question n'est pas claire.


@Gordonlinoff 1) Cela fait beaucoup de sens: imaginez que l'une est la liste des transactions. L'autre est la liste de description du produit. Si vous avez vendu le produit val = 7 deux fois, vous vous attendez à ce que le montant total soit comptabilisé deux fois.


@Gordonlinoff 2) Les doublons sont dans la requête interne


@zerkms. . . dans implicitement déduit les résultats. En fait, en général, un où la clause ne peut augmenter le nombre de lignes en cours de traitement.


@Gordonlinoff C'est vrai, et c'est tout le sujet de la question: ils doivent somme autant de fois que la requête interne renvoie la valeur correspondante.


@zerkms. . . J'ai mal interprété la question. Vous avez la bonne réponse.


3 Réponses :


0
votes

J'ai un hunch que vous avez juste besoin de grouper par le produit.

SELECT prod_id, SUM(cost) AS TotalCost
FROM tableX 
WHERE prod_id IN (
    SELECT DISTINCT prod_id 
    FROM tableY
    WHERE val = 7
)
GROUP BY prod_id


0 commentaires

2
votes

Je ne l'ai pas vérifié, mais je ne vois pas une raison pour laquelle cela ne fonctionnera pas:

SELECT SUM(cost)
FROM tableX
INNER JOIN tableY ON tableX.prod_id = tableY.prod_id AND tableY.val = 7


1 commentaires

Ça l'a fait. Ce n'était pas tout à fait une traduction directe à mon étui d'utilisation spécifique (où la tabley était un ensemble complexe de sous-requêtes) ... mais il a répondu à la question comme demandé et m'a dirigé dans la bonne direction pour une solution. Merci!



0
votes

Utilisation d'une jointure au lieu de dans s'assurera que chaque article x serait compté autant de fois que des enregistrements dans le y : < Pré> xxx

Notez que cette approche ne fonctionne que dans des situations lorsque vous ne souhaitez pas récupérer d'autres colonnes de x . Si ce n'est pas le cas, vous auriez besoin de regrouper sur les colonnes supplémentaires que vous souhaitez revenir: xxx


0 commentaires