过滤和使用动态排序时获取不同的行

时间:2013-09-28 19:31:36

标签: sql-server tsql sql-server-2005

我的问题的第一个版本令人困惑,我需要制作更小的块。 如果用户可以从网站过滤产品,则一个产品只能在列表中出现一次。 由于加入这个代码给了我两个相同的产品,我该如何解决? 我想我需要一个没有使用不同的解决方案,因为它会让我头疼。

来自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反射器

编辑:

谢谢,我现在使用Group by来获取不同的行。 是的,也许是按照我的工作分组,我现在要做一些测试......

嗨再次

我希望所有产品都可以搜索,所以我想我需要左外连接来实现这一点。 当我遇到麻烦添加动态订单时,会添加更多行。 可能是因为我必须将poh.Status添加到组中。 产品表中有504行,此查询返回776行。 (我已经删除了WHERE中的过滤,因为它现在不感兴趣,我现在加入其他表只是为了获得更多的行)

代码:



    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

1 个答案:

答案 0 :(得分:1)

如果您不打算包含distinct,可以使用Group By ProductId,Name来选择单行。但如果你没有在select子句中使用任何聚合值,我会更喜欢“distinct”。

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