2013-09-28 2 views
0

Моя первая версия вопроса была запутанной, мне нужно сделать небольшие куски. Если пользователь может фильтровать продукты с веб-сайта, один продукт должен появляться только один раз в списке. Из-за присоединения этот код дает мне два одинаковых продукта, как я могу это решить? Я думаю, что мне нужно решение без использования отдельных, потому что это даст мне головную боль позже.Получите отдельные строки при фильтрации и использовании динамического порядка на

код из AW2012:



    declare @safetystocklevel int 
    set @safetystocklevel = 1000 
    declare @status int 
    set @status = 2 

    select * from Production.Product p 
    inner join Purchasing.ProductVendor pv on p.ProductID = pv.ProductID 
    inner join Purchasing.Vendor v on v.BusinessEntityID = pv.BusinessEntityID 
    inner join Production.ProductDocument pd on p.ProductID = pd.ProductID 
    inner join Production.Document d on d.DocumentNode = pd.DocumentNode 
    WHERE 
    (@safetystocklevel = '' or p.SafetyStockLevel = @safetystocklevel) 
    and (@status = '' or d.Status = @status) 

выход:
PRODUCTID Название
506 Рефлектор
506 Рефлектор

Edit:

Спасибо, я теперь использовать группу по получить различные строки , Да, возможно, используя группу работами для меня, Im собирается сделать некоторые испытания теперь .....

Привет снова

Я хочу, чтобы все продукты, чтобы можно было найти, так что я думаю, мне нужно левое внешнее соединение, чтобы достичь что. Когда я добавляю динамический порядок, я попадаю в неприятности, добавляется больше строк. Возможно, потому что я должен добавить poh.Status в группу. В таблице продуктов есть 504 строки, этот запрос возвращает 776 строк. (я удалил фильтрацию в WHERE, поскольку это не интересно сейчас, и Im присоединение к другим таблицам теперь только, чтобы получить больше строк, чтобы играть с)

Код:



    declare @sortType nvarchar(50) 
    set @sortType = 'Status' 
    select p.ProductID, 
    CASE WHEN @sortType = 'Status' THEN poh.Status END as Status, 
    CASE WHEN @sortType = 'ProductId' THEN p.ProductID END as ProductId 
    from Production.Product p 
    left outer join Purchasing.PurchaseOrderDetail pod on p.ProductID = pod.ProductID 
    left outer join Purchasing.PurchaseOrderHeader poh on poh.PurchaseOrderID = pod.PurchaseOrderID 
    left outer join Production.ProductDocument ppd on ppd.ProductID = p.ProductID 
    left outer join Production.Document pd on pd.DocumentNode = ppd.DocumentNode 
    group by p.ProductID, poh.Status 
    ORDER BY 
     CASE WHEN @sortType = 'Status' THEN poh.Status END ASC, 
     CASE WHEN @sortType = 'ProductId' THEN p.ProductID END ASC 

+0

Уточнить вопрос? Не совсем ясно, что вы хотите добиться. Можете ли вы показать таблицу (предположительно ручной работы), которая показывает (некоторые) данные, которые вы ожидаете получить? –

+0

Привет, я обновил вопрос –

+0

@CliffSmith, я полагаю, поскольку вы используете разные, что одна из таблиц 1-n, в этом случае какая? Я имею в виду, что приводит к тому, что в наборе результатов есть несколько строк продукта, где вы только хотите? – mewm

ответ

1

Вы можете использовать Группировать по ProductId, Name, чтобы выбрать одну строку, если вы не планируете включать отдельные. Но я предпочел бы «отличную», если вы не используете какое-либо агрегированное значение в предложении select.

select p.ProductId, p.Name from Production.Product p 
inner join Purchasing.ProductVendor pv on p.ProductID = pv.ProductID 
inner join Purchasing.Vendor v on v.BusinessEntityID = pv.BusinessEntityID 
inner join Production.ProductDocument pd on p.ProductID = pd.ProductID 
inner join Production.Document d on d.DocumentNode = pd.DocumentNode 
WHERE 
(@safetystocklevel = '' or p.SafetyStockLevel = @safetystocklevel) 
and (@status = '' or d.Status = @status) 
GROUP BY p.ProductId, p.Name 
+0

Спасибо, я отредактировал мой вопрос. –

+0

Если предложение Group BY работает для вас, вы можете принять ответ и принять участие в голосовании. – Viji

+0

Вы видели мое последнее обновление? –

Смежные вопросы