从SQL中的同一行返回最小值大于零

时间:2019-05-03 11:05:00

标签: mysql sql

我想从其他供应商那里获取最少的价格,并提供供应商的名称。最小值应大于零(0)。如果列表中没有零,我已经能够获得最小值。例如,根据下面的代码,我希望能够选择17作为最低价格,而不是0和sup3作为供应商。 参见下面的代码:

SELECT least(sup1,sup2,sup3,sup4,sup5) AS mininumValue,
       (CASE least(sup1, sup2, sup3, sup4, sup5)
            WHEN sup1 THEN 'sup1'
            WHEN sup2 THEN 'sup2'
            WHEN sup3 THEN 'sup3'
            WHEN sup4 THEN 'sup4'
            WHEN sup5 THEN 'sup5'
        END) as Supplier 
FROM price_charts  
WHERE partno = 'OL0002';

enter image description here

1 个答案:

答案 0 :(得分:3)

这在MySQL中有些痛苦。一种方法是取消数据透视,筛选和聚合。另一个是做一些技巧。

很遗憾,如果任何值为LEAST()NULL返回NULL。但是您可以使用一个神奇的值:

select least(coalesce(nullif(sup1, 0), 999999),
             coalesce(nullif(sup2, 0), 999999),
             coalesce(nullif(sup3, 0), 999999),
             coalesce(nullif(sup4, 0), 999999),
             coalesce(nullif(sup5, 0), 999999)
            ) as minimumValue,
       (case least(coalesce(nullif(sup1, 0), 999999),
                   coalesce(nullif(sup2, 0), 999999),
                   coalesce(nullif(sup3, 0), 999999),
                   coalesce(nullif(sup4, 0), 999999),
                   coalesce(nullif(sup5, 0), 999999)
                  )
            when sup1 then 'sup1'
            when sup2 then 'sup2'
            when sup3 then 'sup3'
            when sup4 then 'sup4'
            when sup5 then 'sup5'
       end) as Supplier 
from price_charts pc 
where partno = 'OL0002';

注意:您的数据模型较差。您应该有另一个表,每个供应商和价格都有一行,不要将值透视到单独的栏中。