根据值

时间:2017-03-13 07:31:36

标签: mysql sql

我有下表:

contract_nr     id_supplier id_seller   id_vendor
01              1521        NULL        NULL
01              1521        2           NULL
01              NULL        NULL        538
02              NULL        NULL        154
02              NULL        NULL        159
03              2626        17          NULL
03              NULL        17          124

结果应该是一个分组表,其中包含基于以下规则的类别字段:

  1. 如果有id_supplier或id_seller,则为NULL,那么它就是 类别1
  2. 如果只有id_vendor和id_supplier且id_seller为NULL, 那么它就是category2
  3. 结果应如下所示:

    contract_nr     category
    01              category1
    02              category2
    03              category1
    

3 个答案:

答案 0 :(得分:1)

您可以使用与case表达式配对的聚合来检查数据所需的条件:

select
    contract_nr,
    case
        when max(id_supplier) is not null 
                or max(id_seller) is not null
            then 'category1'
        when max(id_vendor) is not null
                and max(id_supplier) is null 
                and max(id_seller) is null
            then 'category2'
    end as category
from your_table
group by contract_nr;

它使用max返回聚合组中的最大非空值的事实。如果组中只存在空值,则它将返回null。

另请注意,如果两个条件都不符合,它将在类别中返回null。您可能希望在案例中添加else 'category3'以捕获该内容。

Demo

答案 1 :(得分:0)

按contract_nr分组,然后使用TAF WATT 301700Z 3018/3118 12005KT 8000 FEW020 BECMG 3022/3024 9999= TAF WIII 301700Z 3018/3124 VRB05KT 4000 HZ FEW020 SCT100 BECMG 3101/3103 02010KT 8000 NSW SCT022= case when(不包括空值)来执行此操作:

count

请参阅sqlfiddle中的demo

答案 2 :(得分:0)

您可以使用条件聚合

SELECT contract_nr,
       CASE 
          WHEN SUM(id_supplier IS NOT NULL) + SUM(id_seller IS NOT NULL) >= 1 
             THEN 'category1'
          WHEN SUM(id_vendor IS NOT NULL) THEN 'category2'
          ELSE 'N/A'
       END   
FROM mytable
GROUP BY contract_nr;

在MySQL中,您可以将SUM与布尔表达式一起使用,以查找每个组中满足条件的次数。因此,使用谓词:

SUM(id_supplier IS NOT NULL) + SUM(id_seller IS NOT NULL) >= 1

我们可以测试,对于给定的contract_nr至少有一个记录是否存在 id_supplier id_seller或两者不为空。

Demo here