检查某个行是否存在,否则选择不同的行

时间:2016-09-01 10:23:27

标签: sql oracle

假设我有一个包含

的表格
|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中做到这一点

(抱歉格式化的表格不好,我只是不按正确方式格式化)

谢谢

2 个答案:

答案 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