首页 > 解决方案 > 如何将行值显示为列?

问题描述

我有这张桌子:

FIELD_CODE  PY_DATIME   PARAM_NAME  PARAM_VAL


F262/034    29-JAN-2021 IRRIGATION_AMOUNT   0
F262/034    29-JAN-2021 MAX_TS_20   250
F262/034    29-JAN-2021 MAX_TS_40   168
F262/034    29-JAN-2021 ET  1.616806
F262/034    30-JAN-2021 MDS 25
F262/034    30-JAN-2021 GROWTH  -8.333333
F262/034    30-JAN-2021 PLANT_STATUS    90
F262/034    30-JAN-2021 IRRIGATION_AMOUNT   0
F262/034    30-JAN-2021 MAX_TS_20   81
F262/034    30-JAN-2021 MAX_TS_40   83
F262/034    30-JAN-2021 ET  1.1099839
F262/034    31-JAN-2021 MDS 56.666668
F262/034    31-JAN-2021 GROWTH  18.333334
F262/034    31-JAN-2021 PLANT_STATUS    70
F262/034    31-JAN-2021 IRRIGATION_AMOUNT   0
F262/034    31-JAN-2021 MAX_TS_20   114
F262/034    31-JAN-2021 MAX_TS_40   95
F262/034    31-JAN-2021 ET  2.2792487

我想显示这样的数据:

FIELD_CODE PY_DATIME MDS GROWTH  PLANT_STATUS    IRRIGATION_AMOUNT   MAX_TS_20   MAX_TS_40 ET

我需要从 PARAM_NAME 列中获取值并将它们设为列。并将 PARAM_VAL 作为值。但只显示一次 PY_DATIME 和 FIELD_CODE。

表的主键是 (FIELD_CODE, PY_DATIME, PARAM_NAME)

谢谢。

标签: sqloracleplsql

解决方案


您可以为此使用条件聚合——假设您事先知道所需的列:

select field_code, py_datetime,
       max(case when param_name = 'MDS' then param_val end) as mds,
       max(case when param_name = 'GROWTH' then param_val end) as GROWTH,
       max(case when param_name = 'PLANT_STATUS' then param_val end) as PLANT_STATUS,
       max(case when param_name = 'IRRIGATION_AMOUNT' then param_val end) as IRRIGATION_AMOUNT,
       max(case when param_name = 'MAX_TS_20' then param_val end) as MAX_TS_20,
       max(case when param_name = 'MAX_TS_40' then param_val end) as MAX_TS_40,
       max(case when param_name = 'ET' then param_val end) as ET
from t
group by field_code, py_datetime;

推荐阅读