0
votes

SQL Subquiery: Afficher les clients qui ont acheté deux articles

Edit:

Merci tout. Cela aurait dû être CustomerID, non productible, reliant ces deux tables. Même avec cela, la requête n'a pas renvoyé d'identifiants de clients en raison de ce que dit Squirrel; C'était une mauvaise requête. J'ai trouvé un meilleur succès en utilisant la syntaxe suivante: xxx

J'essaie de retourner CustomerID S qui ont acheté deux éléments avec un spécifique ProductID S (710 et 715) - mais n'a pas acheté 716 - dans la colonne productide d'une deuxième table. J'essaie de jouer cela comme une sous-requête, mais je reçois une erreur

Erreur SQL [207] [S0001]: Nom de colonne non valide 'Producteur'

Ceci est mon bloc de code: xxx

toute aide de correction de l'erreur syntaxique serait appréciée. Merci!


7 commentaires

Pouvons-nous voir le schéma des tables Sales.Customer et vente.SalesAserDeTetail?


Essayez quelque chose comme ceci: Sélectionnez SC.Customéride de Sales.Customer SC Où Producteur dans (Sélectionnez Producteur à partir de Sales.SalesArtionDetail SOD où Sod.Productid in (710, 715)) et ProductId non dans (Sélectionnez ProductId de Sales.SalesArserDeTetail de SOD .Productid = 716)


Êtes-vous sûr que la colonne ProductID est dans SometchSOrderDetail TABLE?


@Abdelrahmangarah, je crois que ProductID est en salopeOrderDetail mais je ne pense pas que le produit devrait être dans la table des clients. Je crois que la clientèle devrait être le lien entre les deux tables si le modèle est fait correctement


Votre premier 2 condition n'a pas de sens. Effectivement, vous dites où productid in (710) et productid in (715) et le résultat est faux il n'y aura pas de ProductID qui peut satisfaire ces 2 conditions. Vous voudrez peut-être jeter un oeil à existant ()


@Zip - Merci pour la prise. Vous êtes correct que l'ID de produit n'est pas dans la table du client. ID client est la colonne de liaison. Cependant, il ne renvoie aucun résultat. Je crois que l'écureuil était correct - j'ai une mauvaise requête. J'ai essayé une méthode différente et crois que j'ai atteint le résultat souhaité.


J'ai ajouté une requête comme une réponse, avez-vous essayé?


3 Réponses :


0
votes

Essayez quelque chose comme ceci: xxx

exécutez d'abord les instructions de sous-sélection d'abord pour obtenir la syntaxe à droite pour cette pièce, pour votre moteur SQL. Par exemple, exécutez cette requête SQL d'abord: xxx

et lorsque vous avez la syntaxe valide et les résultats valides, vous pouvez utiliser ce sélection comme une instruction SOUS-SELECT. Idem pour le sous-sélection "non in". Exécutez-le et obtenez des résultats valides puis inclure-le entre parenthèses comme sous-sélection.


1 commentaires

Je vais essayer cela comme une alternative. Merci!



0
votes

C'est ma prise sur ceci: Je crois que ProductID est en salopeOrderDetail mais je ne pense pas que le produit devrait être dans la table des clients. Je crois que la clientèle devrait être le lien entre les deux tables si le modèle est effectué à droite xxx


2 commentaires

Non, cela n'a pas fonctionné. Il n'a pas renvoyé aucun ID de client. J'ai créé maintenant le code, que j'ai posté sous mon édition en haut. Celui-là semble faire l'affaire! Merci quand même!


Ok, je vois, vous avez supprimé la contrainte sur le produit 716.



1
votes

OK sur la question, mais à l'avenir, il est bon de fournir des échantillons de données, des colonnes pour obtenir le point de vue. Vous ne montrez pas comment une commande de vente se joint au détail de la commande de vente. Cela étant dit, je vais fournir une supposition éduquée à ce que vous avez.

Je ferais une interrogation une fois et que vous obtenez un compte par produit qualifié ... puis appliquez-le d'avoir. Il est possible pour une personne d'avoir plusieurs commandes et que chaque produit pourrait être sur un ordre différent (à moins que tout ce que vous vous souciez du même ordre, ce soit légèrement différent). P>

select
      SO.CustomerID
      -- at THIS point, I only care did the person have any of the products
      max( case when SOD.ProductID = 710 then 1 else 0 end ) as HasProduct1,
      max( case when SOD.ProductID = 715 then 1 else 0 end ) as HasProduct2,
      max( case when SOD.ProductID = 716 then 1 else 0 end ) as HasProduct3
   from
      Sales.SalesOrder SO
         JOIN Sales.SalesOrderDetail SOD
            on SO.SalesOrderID = SOD.SalesOrderID
   group by
      SO.CustomerID
   having 
       -- NOW, we can apply the product 1 & 2 purchased, but NOT product 3
          max( case when SOD.ProductID = 710 then 1 else 0 end ) = 1
      AND max( case when SOD.ProductID = 715 then 1 else 0 end ) = 1
      AND max( case when SOD.ProductID = 716 then 1 else 0 end ) = 0


1 commentaires

Approche intéressante. J'aime ça. Merci!