首页 > 解决方案 > 有时缺少数据时的行到列

问题描述

将数据从行转换为列。我有两ID行,一个文本VARCHAR2类型行。但其中一ID排并不总是相同的。有时会丢失数据。

我试过了PIVOTGROUP BY直到现在这给了我唯一的错误。

SELECT prj_id, udn_id, txt_value
FROM TBL
GROUP BY tbl.prj_id;

我想改变这个:(空行只是为了更好的可见性)

PRJ_ID  UDN_ID  TXT_ VALUE
8344    82      13/10/2009
8344    64      E S
8344    178     End

8364    82      12/10/2009
8364    64      A M
8364    89      M
8364    178     Internal

8335    82      05/10/2009
8335    64      E S
8335    89      N
8335    178     End

8377    82      13/10/2009
8377    64      Z D
8377    89      N;M
8377    178     Internal

对此:

        82          64      89      178         
8344    13/10/2009  E S     N/A     End
8364    12/10/2009  A M     M       Internal
8335    05/10/2009  E S     N       End
8377    13/10/2009  Z D     N;M     Internal

知道如何用 SQL 解决这个问题吗?

标签: sqloraclepivot

解决方案


老式的方法(在 之前PIVOT)是使用DECODE(或CASE,为了更好的可读性)聚合值。这是一个示例(第 16 行以后是您要查找的内容):

SQL> with tbl (prj_id, udn_id, txt_value) as
  2    (select 8344, 82, '13/10/2009' from dual union all
  3     select 8344, 64, 'E S'        from dual union all
  4     select 8344, 178, 'End'       from dual union all
  5     --
  6     select 8364, 82, '12/10/2009' from dual union all
  7     select 8364, 64, 'A M'        from dual union all
  8     select 8364, 89, 'M'          from dual union all
  9     select 8364, 178, 'Internal'  from dual union all
 10     --
 11     select 8335, 82, '05/10/2009' from dual union all
 12     select 8335, 64, 'E S'        from dual union all
 13     select 8335, 89, 'N'          from dual union all
 14     select 8335, 178, 'End'       from dual
 15    )
 16  select prj_id,
 17         max(case when udn_id =  82 then txt_value end) "82",
 18         max(case when udn_id =  64 then txt_Value end) "64",
 19         max(case when udn_id =  89 then txt_value end) "89",
 20         max(case when udn_id = 178 then txt_Value end) "178"
 21  from tbl
 22  group by prj_id;

    PRJ_ID 82         64         89         178
---------- ---------- ---------- ---------- ----------
      8335 05/10/2009 E S        N          End
      8344 13/10/2009 E S                   End
      8364 12/10/2009 A M        M          Internal

SQL>

推荐阅读