有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.
我没有尝试任何事情,因为我真的不知道在我的问题中尝试什么或者甚至不知道什么。有什么建议吗?
答案 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