возвращать различные продукты на основе product_id - PullRequest
0 голосов
/ 05 января 2010

Прямо сейчас запрос ниже извлекает больше чем одну запись продукта. Как можно ограничить набор результатов только получением одной записи для product_ID? Несколько записей будут возвращены из разных продуктов, но мне нужна только одна линейка продуктов для product_id. Это MS SQL 2005

 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

Ответы [ 3 ]

3 голосов
/ 05 января 2010

Wow вы действительно хотите сгруппировать по такому количеству полей? Обычно, когда я вижу операторы SQL, которые имеют некие агрегаты и группы почти по каждому столбцу в таблице, это признак того, что это, вероятно, неправильно. Он может вернуть правильные данные на сегодня, но завтра это другая история. Прочтите DISTINCT, Group By и Inner Queries, чтобы справиться с этим соответствующим образом. Надлежащим способом опубликовать этот вопрос было дать нам некоторые данные из таблицы и дать нам то, что вы хотите, в качестве ожидаемого результата или желаемых результатов. Моя склонность говорит мне, что вы хотите что-то вроде

SELECT .. FROM .. INNER JOIN (SELECT ...)...GROUP BY SomeField
1 голос
/ 05 января 2010

Если вы хотите получить один результат для каждого идентификатора продукта, то вам придется взять МАКС для всех остальных столбцов, кроме идентификатора продукта, а затем группировать только по идентификатору продукта. Однако это может вызвать другие проблемы, поэтому вам необходимо понять последствия и, что более важно, характер ваших данных.

0 голосов
/ 05 января 2010

Я попытаюсь объяснить технику, но оставлю на ваше усмотрение исправить ваш запрос.

Давайте начнем с таблицы:

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

А теперь я хочу перечислить только один элемент каждого цвета (похоже на вашу проблему)

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

Возвращает

Id          Color
----------- ----------
1           BLUE
4           GREEN
3           RED
7           YELLOW
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...