【问题标题】:How to eliminate null and display value instead [duplicate]如何消除空值并改为显示值[重复]
【发布时间】:2022-01-27 00:17:37
【问题描述】:

我有如下表格

| EMPID    | MESASURE |          | MEASURE_VAL1    |MEASURE_VAL2    |MEASURE_VAL3   |
| -------- | --------------      |----------       |--------------  |--------------
| A        | MEASURE1            | 10              | NULL           | NULL
| A        | MEASURE2            | NULL            | 20             | NULL
| A        | MEASURE3            | NULL            | NULL           | 30
| A        | MEASURE4            | NULL            | NULL           | NULL

我想得到结果

| EMPID | MEASURE 1 | MEASURE 2 | MEASURE 3
-------------------------------------------
| A     |  10       | 20        | 30

我尝试了 where not null 并且只得到一个值。请建议。谢谢

【问题讨论】:

  • 如果后来有人添加了 MMEASURE4 值,您是否希望突然出现 MEASURE 4 列? (那么 MEASURE5、6 和 7 呢?)
  • 是的,当度量 4 中没有空值时,
  • 对每个 measure_val 使用 MAX 聚合以及按 empid 分组
  • 如果一行中超过 1 个度量值不为空,会发生什么情况?

标签: sql oracle


【解决方案1】:

使用SUM(或MAX)聚合函数:

SELECT empid,
       SUM(measure_val1) AS measure1,
       SUM(measure_val2) AS measure2,
       SUM(measure_val3) AS measure3
FROM   table_name
GROUP BY empid;

其中,对于样本数据:

CREATE TABLE table_name (EMPID, MESASURE, MEASURE_VAL1, MEASURE_VAL2, MEASURE_VAL3) AS
SELECT 'A', 'MEASURE1', 10,   NULL, NULL FROM DUAL UNION ALL
SELECT 'A', 'MEASURE2', NULL, 20,   NULL FROM DUAL UNION ALL
SELECT 'A', 'MEASURE3', NULL, NULL, 30   FROM DUAL UNION ALL
SELECT 'A', 'MEASURE4', NULL, NULL, NULL FROM DUAL;

输出:

EMPID MEASURE1 MEASURE2 MEASURE3
A 10 20 30

db小提琴here

【讨论】:

    【解决方案2】:

    对我来说,它看起来像

    SQL> with test (empid, measure, measure_val1, measure_val2, measure_val3) as
      2    (select 'A', 'MEASURE1', 10  , null, null from dual union all
      3     select 'A', 'MEASURE2', null, 20  , null from dual union all
      4     select 'A', 'MEASURE3', null, null, 30   from dual union all
      5     select 'A', 'MEASURE4', null, null, null from dual
      6    )
      7  select empid,
      8    max(case when measure = 'MEASURE1' then nvl(measure_val1, 0) + nvl(measure_val2, 0) + nvl(measure_val3, 0) end) measure_1,
      9    max(case when measure = 'MEASURE2' then nvl(measure_val1, 0) + nvl(measure_val2, 0) + nvl(measure_val3, 0) end) measure_2,
     10    max(case when measure = 'MEASURE3' then nvl(measure_val1, 0) + nvl(measure_val2, 0) + nvl(measure_val3, 0) end) measure_3,
     11    max(case when measure = 'MEASURE4' then nvl(measure_val1, 0) + nvl(measure_val2, 0) + nvl(measure_val3, 0) end) measure_4
     12  from test
     13  group by empid;
    
    EMPID  MEASURE_1  MEASURE_2  MEASURE_3  MEASURE_4
    ----- ---------- ---------- ---------- ----------
    A             10         20         30          0
    
    SQL>
    

    【讨论】:

    • 谢谢,它可以工作,但是除了 max 函数还有其他方法吗。
    • 不客气。选择?当然,MIN函数。部分开玩笑,但是 - 如果你想在一行中得到结果,你确实需要一个聚合函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 2019-08-13
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多