假设我有一个包含
的表格|vendor | price| productID|
|--------------------------------|
|abc | 6 | 0001 |
|1 | 7 | 0001 |
|def | 8 | 0001 |
|xyz | 30 | 0002 |
|zxy | 32 | 0002 |
现在我想得到一个产品的min()价格的供应商
对于产品0001,将是供应商<strong> abc
对于商品0002,供应商 xyz
BUT!如果有一个名为 1 的供应商,如果产品没有名为 1 的供应商,我希望看到他的名字而不是具有min()价格的实际供应商,我希望再次看到具有min()价格的那个
如果这对你有意义..它有点像if-else结构但我不知道如何在SQL中做到这一点
(抱歉格式化的表格不好,我只是不按正确方式格式化)
谢谢
答案 0 :(得分:5)
这是优先级查询。一种方法是使用row_number()
并将优先级的规则放入order by
。结果查询:
select t.*
from (select t.*,
row_number() over (partition by productId
order by (case when vendorid = 1 then 1 else 2 end),
price asc
) as seqnum
from t
) t
where seqnum = 1;
答案 1 :(得分:0)
(目前)接受的答案不符合OP的要求。要求是显示每种产品的最低价格,即使供应商'1'
没有最低价格。但是,当其他人的价格最低但供应商'1'
也销售同一产品时,请将供应商名称替换为'1'
(但不要将最低价格更改为供应商`1``价钱)。这看起来像&#34;将会遇到我的竞争对手&#39;最低价格&#34;安排类型。
查询和输出:
with
price_table ( vendor, price, productid ) as (
select 'abc', 6 , '0001' from dual union all
select '1' , 7 , '0001' from dual union all
select 'def', 8 , '0001' from dual union all
select 'xyz', 30 , '0002' from dual union all
select 'zxy', 32 , '0002' from dual
),
prep ( vendor, price, productid, rn, ct ) as (
select vendor, price, productid,
row_number() over (partition by productid order by price),
count( case when vendor = '1' then 1 end ) over ( partition by productid)
from price_table
)
select case when ct = 0 then vendor else '1' end as vendor,
price,
productid
from prep
where rn = 1
;
VENDOR PRICE PROD
------ ------- ----
1 6 0001
xyz 30 0002