加入交替的可能性

时间:2012-04-24 05:12:49

标签: sql sql-server sql-server-2008

Select声明

    Select i.ItemID, s.Price, s.Qty, s.Company From Item i
    Inner Join Sku s ON s.ItemID = i.ItemID

返回此内容:

ItemID  |   Price   |   Qty |   Company
    1   |   $50.00  |   0   |   Abc inc.
    1   |   $45.00  |   5   |   Def inc.
    1   |   $35.00  |   15  |   Xyz inc.

    2   |   $36.00  |   4   |   Abc inc.
    2   |   $45.00  |   5   |   Def inc.
    2   |   $35.00  |   1   |   Xyz inc.

    3   |   $20.00  |   2   |   Abc inc.
    3   |   $45.00  |   0   |   Def inc.
    3   |   $35.00  |   5   |   Xyz inc.

但需要有以下逻辑:

显示价格和数量最低的行> 0,包括推荐公司到该结果。

ELSE ...

显示价格最低的行,包括推荐该价格的公司。

看起来像这样:

ItemID  |   Price  |    Qty |   Company
    1   |   $35.00  |   15  |   Xyz inc.

    2   |   $35.00  |   1   |   Xyz inc.

    3   |   $20.00  |   2   |   Abc inc.

我没有尝试任何事情,因为我真的不知道在我的问题中尝试什么或者甚至不知道什么。有什么建议吗?

6 个答案:

答案 0 :(得分:1)

这是一种方法:

SELECT      I.ItemId
        ,   S.Price
        ,   S.Qty
        ,   S.Company
FROM        dbo.Item    I
CROSS APPLY (
                SELECT  MIN(Price)  Price
                FROM    dbo.Sku     MP
                WHERE   I.ItemId    = MP.ItemId
                AND     Qty         > 0
            ) MP
CROSS APPLY (
                SELECT 
                TOP 1   Price
                    ,   Qty
                    ,   Company
                FROM    dbo.Sku     S
                WHERE   S.ItemId    = I.ItemId
                AND     S.Price     = MP.Price
            ) S

答案 1 :(得分:1)

这样的事情怎么样,使用行号:

select 
    i.ItemId, s.Price, s.Qty, s.Company 
from
    item i
inner join
    (
        select 
            t.ItemId,
            t.Price, 
            t.Qty, 
            t.Company, 
            RowNumber = row_number() over (PARTITION BY t.ItemId order by t.price asc, t.qty desc)
        from 
            Sku t
    ) s on s.itemid = i.ItemId
where 
    s.RowNumber = 1

行号“分区依据”和“排序依据”在此非常重要,以确保正确的结果,即使项目的所有数量均为0,这也是有效的。

答案 2 :(得分:0)

Select i.ItemID, Min(s.Price) as Price, s.Qty, s.Company 
From Item i Inner Join Sku s ON s.ItemID = i.ItemID 
Where s.qty > 0 
Group by i.itemid, s.qty, s.Company 

答案 3 :(得分:0)

这是查询,

Select i.ItemID, s.Price, s.Qty, s.Company 
From Item i
Inner Join Sku s
  ON s.ItemID = i.ItemID
Inner Join (
    select min(price) as Price, ItemID
    from Sku
    where Qty > 0
    group by ItemId
  )a
on a.ItemId = s.ItemId
and a.Price = s.Price

如果您只需要Item表中的ItemId,则可以删除与Item表本身的连接,因为Sku中存在ItemId。

答案 4 :(得分:0)

Select i.ItemID, min(s.Price) as price, s.Qty, s.Company From Item i 
Inner Join Sku s ON s.ItemID = i.ItemID  and s.qty>0
group by i.itemid, s.company, s.qty

答案 5 :(得分:0)

基本上,您需要第一个sku记录,首先根据它是否有任何库存(首先出现库存的物品),然后按价格,升序排序。在以下查询中,公用表表达式返回所需的SKU字段以及RowNum计算字段。 RowNum由ItemID分区(即,对于每个新的ItemID重置为1),并先按库存的顺序排序,然后按价格排序。然后,主查询从每个ItemID中选择第一条记录:

WITH cte AS (
    SELECT ItemID, Price, Qty, company,
    ROW_NUMBER() OVER (PARTITION BY ItemId ORDER BY 
        CASE WHEN Qty > 0 THEN 1 ELSE 0 END DESC, Price ASC) AS RowNum
    FROM #sku
    )
SELECT ItemID, price, qty, Company FROM cte WHERE RowNum = 1