2010-01-05 9 views
0

En ce moment, la requête ci-dessous récupère plus d'un enregistrement de produit. Comment puis-je limiter l'ensemble de résultats à la récupération de l'enregistrement unique par ID_produit? Plusieurs enregistrements seront renvoyés à partir de différents produits, mais je n'ai besoin que d'une ligne de produits par ID_produit. Ceci est MS SQL 2005retourner des produits distincts basés sur product_id

SELECT DISTINCT dbo.Products.Product_ID AS Expr1, 
       CASE 
           WHEN dbo.Products.thumbnail  IS NULL 
           OR    dbo.Products.thumbnail = '' 
           THEN dbo.Products.Smimage 
           ELSE dbo.Products.thumbnail 
       END AS image                           , 
       dbo.Products.ProductTitle                        , 
       '<img WIDTH="62" src="http://media.companyinc.com/companyinc/SKUimages/small/' + dbo.Products.Smimage + '">' AS URLImage, 
       dbo.INV_dropshippers_To_ProductOptions.sku                    , 
       dbo.Products.Discontinued                        , 
       dbo.Products.CloseOut                         , 
       dbo.Products.Special                         , 
       dbo.Products.Active                          , 
       dbo.Products.location_id                        , 
       dbo.INV_dropshippers_To_ProductOptions.dropshipper_id                 , 
       dbo.Products.season                          , 
       dbo.Products.thumbnail                         , 
       dbo.Products.Smimage                         , 
       dbo.Products.CustomField2                        , 
       dbo.Products.pt_type                         , 
       dbo.Products.PartNumber                         , 
       dbo.Products.RetailPrice AS Price                      , 
       dbo.skupurchasedreport.Product_Id                      , 
       dbo.skupurchasedreport.totalprice_date1                     , 
       dbo.skupurchasedreport.totalprice_date2                     , 
       dbo.skupurchasedreport.qtypurchased_date1                    , 
       dbo.skupurchasedreport.qtypurchased_date2                    , 
       dbo.skupurchasedreport.totalprice_date3                     , 
       dbo.skupurchasedreport.qtypurchased_date3                    , 
       dbo.INV_dropshippers_To_ProductOptions.quantity AS currentqty 
FROM   dbo.Products 
       INNER JOIN dbo.skupurchasedreport 
       ON    dbo.Products.Product_ID = dbo.skupurchasedreport.Product_Id 
       LEFT OUTER JOIN dbo.Options AS Options_2 
       RIGHT OUTER JOIN dbo.INV_dropshippers_To_ProductOptions 
       ON    Options_2.Opt_ID = dbo.INV_dropshippers_To_ProductOptions.option_id3 
       LEFT OUTER JOIN dbo.Options AS Options_1 
       ON    dbo.INV_dropshippers_To_ProductOptions.option_id2 = Options_1.Opt_ID 
       LEFT OUTER JOIN dbo.Options 
       ON    dbo.INV_dropshippers_To_ProductOptions.option_id1 = dbo.Options.Opt_ID 
       ON    dbo.Products.Product_ID       = dbo.INV_dropshippers_To_ProductOptions.product_id 
GROUP BY  dbo.skupurchasedreport.Product_Id     , 
       dbo.INV_dropshippers_To_ProductOptions.product_id , 
       dbo.Products.Product_ID        , 
       dbo.Products.ProductTitle       , 
       dbo.Products.thumbnail        , 
       dbo.Products.Smimage         , 
       dbo.INV_dropshippers_To_ProductOptions.sku   , 
       dbo.Products.Discontinued       , 
       dbo.Products.CloseOut        , 
       dbo.Products.Special         , 
       dbo.Products.Active         , 
       dbo.Products.location_id        , 
       dbo.INV_dropshippers_To_ProductOptions.dropshipper_id, 
       dbo.Products.season         , 
       dbo.Products.CustomField2       , 
       dbo.Products.pt_type         , 
       dbo.Products.PartNumber        , 
       dbo.Products.RetailPrice        , 
       dbo.skupurchasedreport.Product_Id     , 
       dbo.skupurchasedreport.totalprice_date1    , 
       dbo.skupurchasedreport.totalprice_date2    , 
       dbo.skupurchasedreport.totalprice_date1    , 
       dbo.skupurchasedreport.totalprice_date3    , 
       dbo.skupurchasedreport.qtypurchased_date1   , 
       dbo.skupurchasedreport.qtypurchased_date2   , 
       dbo.skupurchasedreport.qtypurchased_date3   , 
       dbo.INV_dropshippers_To_ProductOptions.quantity 

Répondre

1

Si vous voulez un résultat par ID de produit, vous devrez prendre un MAX sur toutes les autres colonnes, sauf ID de produit, puis le groupe que par ID produit. Cela pourrait cependant causer d'autres problèmes, vous devez donc comprendre les ramifications et, plus important encore, la nature de vos données.

3

Wow voulez-vous vraiment regrouper par autant de domaines? Généralement, quand je vois des instructions SQL qui ont une sorte d'agrégat et de groupe par presque toutes les colonnes de la table, c'est un signe que c'est probablement faux. Il peut retourner les bonnes données pour aujourd'hui mais demain sera une histoire différente. Consultez DISTINCT, Group By et Inner Queries pour gérer correctement ces problèmes. La bonne façon d'afficher cette question était de nous donner quelques données de la table et de nous donner ce que vous voulez comme résultat attendu ou résultats souhaités. Mon inclination me dit que vous voulez une sorte de

SELECT .. FROM .. INNER JOIN (SELECT ...)...GROUP BY SomeField 
+0

Huh, je ne vois même pas l'agrégat –

+0

@Damir - Je l'ai dit généralement quand je vois des gens écrivant des requêtes comme celle-ci, y compris un s qui peut inclure des agrégats tels que SUM, AVG, etc. Vous pouvez dire à partir de l'apparence de cette requête que c'est faux. L'affiche utilise DISTINCT encore grupping par trop de champs. C'est un problème de ne pas comprendre comment fonctionne GROUP BY/Distinct. – JonH

+0

@JonH, d'accord. –

0

Je vais essayer d'expliquer la technique, mais laissera à vous de fixer votre requête.

Commençons par une table:

DECLARE @tbl TABLE (Id int, Color varchar(10)) 

INSERT INTO @tbl 
     (Id, Color) 
SELECT 1 ,'BLUE' UNION 
SELECT 2 ,'BLUE' UNION 
SELECT 3 ,'RED' UNION 
SELECT 4 ,'GREEN' UNION 
SELECT 5 ,'GREEN' UNION 
SELECT 6 ,'GREEN' UNION 
SELECT 7 ,'YELLOW' UNION 
SELECT 8 ,'YELLOW'; 

Et maintenant, je veux à la liste un seul élément de chaque couleur (similaire à votre problème)

WITH abcd 
     AS (SELECT Id 
        ,Color 
        ,ROW_NUMBER() OVER (PARTITION BY Color ORDER BY Id) AS rn 
      FROM @tbl 
      ) 
    SELECT Id ,Color 
    FROM abcd 
    WHERE rn = 1 

Retours

Id   Color 
----------- ---------- 
1   BLUE 
4   GREEN 
3   RED 
7   YELLOW 
Questions connexes