Les noms de table et de colonne sont vagues car je suis dans le secteur de la santé et je ne peux pas partager de détails spécifiques. J'utilise cette requête pour montrer le montant des économies réalisées à un client s'il achète un produit auprès de mon entreprise (tableau 1) au lieu de son fournisseur actuel (tableau 2).SQL Comparaison de 2 tables tout en limitant les données
J'ai 2 tables comme celui-ci sur un MSQL Server 2008:
Table 1
ProductID
, Description
, Vendor
, Price
Table 2
ProductID
, Description
, Price
Je veux sélectionner chaque ligne de Table 2
et les données correspondantes de Table 1
. Mais je veux seulement retourner le fournisseur avec le meilleur prix (le prix le plus bas parmi les fournisseurs) de Table 1
, pas tous les fournisseurs. Donc pour tout ProductID
dans Table 2
il devrait y avoir une correspondance de Table1
, ou une valeur NULL s'il n'y a pas ProductID
correspondant dans Table 1
. J'ai joint les tables sur ProductID
et j'ai renvoyé toutes les colonnes que je voulais, mais je ne peux pas l'obtenir pour limiter à un seul résultat du tableau 1. Si je fais cela avec 1000 lignes dans Table 2
je devrais retourner 1000 lignes. Je me suis terminé avec quelques extra des matchs de plusieurs fournisseurs.
Les résultats devraient ressembler à ceci:
T1.ProductID, T1.Description, Vendor, T1.Price, T2.ProductID,
T2.Description, T2.Price, (T2.Price - T1.Price) as 'Amount Saved'
SQL je l'ai écrit est assez simple:
SELECT
T1.ProductID,
T1.Description,
Vendor,
T1.Price,
T2.ProductID,
T2.Description,
T2.Price,
(T2.Price - T1.Price) AS 'Amount Saved'
FROM
Table2 T2 LEFT OUTER JOIN Table1 T1
ON T2.ProductID = T1.ProductID
ORDER BY T2.ProductID
Cette réponse de D. Stanley travaillé; avec un changement mineur pour sélectionner chaque rangée avec le prix le plus bas.
SELECT
T1.ProductID,
T1.Description,
T1.Vendor,
T1.Price,
T2.ProductID,
T2.Description,
T2.Price,
(T1.Price - T2.Price) as 'Amount Saved'
FROM Table2 T2
LEFT JOIN (
SELECT * FROM (
SELECT ProductID, Description, Vendor, Price,
ROW_NUMBER() OVER (PARTITION BY ProductID ORDER BY Price ASC) AS Row
FROM Table1) as result
WHERE row=1
) AS T1
ON T2.ProductID = T1.ProductID
Pouvez-vous poster la question? –
Qu'est-ce que "meilleur prix" voulez-vous dire prix le plus bas (minimum), maximum enregistré, etc.? s'il vous plaît coller le code que vous avez essayé –