2014-12-15 3 views
0

У меня есть SQL-запрос, возвращающий к 27 продаж продукции из базы данных:SQL вернуть верхнюю часть продавая продукты из базы данных

SELECT TOP 27 ROW_NUMBER() OVER (ORDER BY ttP.ProductName ASC) AS Rno, ttP.*, ttI.ImageID FROM tblProducts AS ttP 
LEFT OUTER JOIN (SELECT ImageID, ProductID FROM tblImages WHERE Main = 1) AS ttI ON ttP.ProductID = ttI.ProductID 
LEFT OUTER JOIN (SELECT TOP 27 ProductID, SUM(Quantity) AS NumSold FROM tblOrderItems GROUP BY ProductID ORDER BY SUM(Quantity) DESC) 
AS ttOI ON ttP.ProductID = ttOI.ProductID 
WHERE ttP.ProductVisibleOnline = 1 AND ttP.CollectionID IS NULL 
AND ttOI.NumSold IS NOT NULL 
ORDER BY ttOI.NumSold DESC, ttP.ProductName ASC 

Я хочу добавить следующее ИНЕКЕ так что возвращает топ 27 продуктов, имеют определенную функцию

WHERE ttP.ProductID IN (SELECT ProductID FROM tblProductsFeatures WHERE FeatureID = 3) 

Так я иду вперед и добавить его к концу оператора и в конечном итоге с этим:

SELECT TOP 27 ROW_NUMBER() OVER (ORDER BY ttP.ProductName ASC) AS Rno, ttP.*, ttI.ImageID FROM tblProducts AS ttP 
LEFT OUTER JOIN (SELECT ImageID, ProductID FROM tblImages WHERE Main = 1) AS ttI ON ttP.ProductID = ttI.ProductID 
LEFT OUTER JOIN (SELECT TOP 27 ProductID, SUM(Quantity) AS NumSold FROM tblOrderItems GROUP BY ProductID ORDER BY SUM(Quantity) DESC) 
AS ttOI ON ttP.ProductID = ttOI.ProductID 
WHERE ttP.ProductVisibleOnline = 1 AND ttP.CollectionID IS NULL 
AND ttOI.NumSold IS NOT NULL 
AND ttP.ProductID IN (SELECT ProductID FROM tblProductsFeatures WHERE FeatureID = 3) 
ORDER BY ttOI.NumSold DESC, ttP.ProductName ASC 

Это возвращает 11 записей, которые являются подмножеством 27 самых продаваемых товаров без предложения where. Я не понимаю, где я могу поставить предложение where, чтобы получить 27 лучших продуктов с FeatureID = 3. Любая помощь будет принята с благодарностью.

+0

Я не совсем понимаю ваш вопрос. Возможно, образцы данных и желаемые результаты помогут объяснить. Как есть, должно быть только 11 строк, которые соответствуют вашим критериям 'where' -' top 27' ​​не будет ограничивать это. Я подозреваю, что ваша проблема связана с вашим подзапросом - внешнее соединение, выбирая 27 строк, но затем критерии where, отрицающие внешнее соединение ... – sgeddes

ответ

1

Глядя на то, как вы присоединяетесь на tblOrderItems столе, возможно, это то, что вы ищете вместо:

SELECT TOP 27 ROW_NUMBER() OVER (ORDER BY ttP.ProductName ASC) AS Rno, 
       ttP.*, ttI.ImageID 
FROM tblProducts AS ttP 
    LEFT OUTER JOIN (
     SELECT ImageID, ProductID 
     FROM tblImages 
     WHERE Main = 1) AS ttI ON ttP.ProductID = ttI.ProductID 
    INNER JOIN (
     SELECT TOP 27 ProductID, SUM(Quantity) AS NumSold 
     FROM tblOrderItems 
     WHERE ProductID IN (SELECT ProductID 
          FROM tblProductsFeatures 
          WHERE FeatureID = 3) 
     GROUP BY ProductID 
     ORDER BY SUM(Quantity) DESC) AS ttOI ON ttP.ProductID = ttOI.ProductID 
WHERE ttP.ProductVisibleOnline = 1 
    AND ttP.CollectionID IS NULL 
ORDER BY ttOI.NumSold DESC, 
    ttP.ProductName ASC 

Это также заменяет один из ваших outer joins с inner join и удаляет некоторые из where критерии.

0

Проблема заключается в том, что вы находите верхние 27 продуктов в производной таблице (SELECT TOP 27 ...AS ttOI), но затем применяете дополнительные фильтры во внешнем выборе. Это приводит к дальнейшему уменьшению количества строк вашего продукта с 27 до 11, поскольку строки, удаленные внешним фильтром, не будут каким-либо образом заставлять внутреннее 27 ограничение переоцениваться по сравнению с новыми критериями.

Я бы предположил, что вы ВСЕ ПРОФЕССИОНАЛЬНО фильтруете против подходящих продуктов, прежде чем присоединяться к другим столам и оценивайте популярность продукта. Обратите также внимание, что если продукт имеет более одного изображения, вы можете дублировать продукт?

SELECT ROW_NUMBER() OVER (ORDER BY ttP.ProductName ASC) AS Rno, 
     ttP.*, ttI.ImageID 
FROM 
    tblProducts AS ttP 
    INNER JOIN 
    (
    SELECT TOP 27 ttp.ProductId, SUM(ttOI.Quantity) AS NumSold 
    FROM tblProducts AS ttP 
     INNER JOIN tblOrderItems ttOI 
     ON ttP.ProductID = ttOI.ProductID 
     INNER JOIN tblProductsFeatures tPF 
     ON ttP.ProductID = tPF.ProductID 
    WHERE ttP.ProductVisibleOnline = 1 
     AND ttP.CollectionID IS NULL 
     AND ttOI.NumSold IS NOT NULL 
     AND tPF.FeatureID = 3 
    GROUP BY ttp.ProductID 
    ORDER BY SUM(Quantity) DESC) AS ep -- Eligible products 
    ON ttP.ProductID = ep.ProductID 
LEFT OUTER JOIN -- Duplicate Rows if there is more than one image here 
    tblImages AS ttI 
    ON ttP.ProductID = ttI.ProductID 
    AND ttI.Main = 1 
ORDER BY ep.NumSold DESC, ttP.ProductName ASC; 
Смежные вопросы