ORACLE 11g:不同的行而不会失去差异(枢轴?)

时间:2016-05-20 10:22:15

标签: oracle pivot distinct

我必须使用特定名称对行进行分组,而不会在特定列中丢失差异。

进行这样的查询,即搜索医疗程序和您可以执行它们的每个结构:

从TABLE中选择NAME,....(各种连接)WHERE STRUCTURE_CODE IN(' 0123456',' 0999912')

| NAME            | STRUCTURE_CODE   | AGE_LIMIT | BIRTHPLACE_LIMIT |
|-------------------------------------------------------------------|
|RX ABS           | 0123456          | NULL      | NULL             |
|RX ABS           | 0999912          | 50        | NULL             |
|HEAD RESONANCE   | 0999912          | NULL      | NULL             |
|ABS RESONANCE    | 0123456          | 30        | NULL             |
|ABS RESONANCE    | 0999912          | NULL      | ROME             |
|-------------------------------------------------------------------|

(注意:头部共振仅由结构0999912执行)

由于连接和结果列,查询重复具有相同名称的行,因为其他一些列具有不同的值(如AGE_LIMIT等...)。

我必须在网络上为每个不同的NAME显示一行,然后指定每个结构具有的限制(如果有的话)。我可以接受像这样的字符串CONCAT:

| NAME            | AGE_LIMIT                    | BIRTHPLACE_LIMIT                      |
|----------------------------------------------------------------------------------------|
|RX ABS           | 0123456.NULL;0999912.50      | 0123456.NULL;0999912.NULL             |
|HEAD RESONANCE   | 0999912.NULL;                | 0999912.NULL;                         |
|ABS RESONANCE    | 0123456.30;0999912.NULL      | 0123456.NULL;0999912.ROME             |
|----------------------------------------------------------------------------------------|

在呈现网页之前,Java将转换为连接字符串,以便以更易读的方式翻译它们。

这是可能的还是您认为还有另一种优雅的解决方案?

感谢。

2 个答案:

答案 0 :(得分:1)

SELECT 
    NAME,
    LISTAGG(STRUCTURE_CODE||'.'||AGE_LIMIT , ',') WITHIN GROUP (ORDER BY STRUCTURE_CODE) AS AGE_LIMIT ,
    LISTAGG(STRUCTURE_CODE||'.'||BIRTHPLACE_LIMIT , ',') WITHIN GROUP (ORDER BY STRUCTURE_CODE) AS BIRTHPLACE_LIMIT                        
FROM "TABLE" GROUP BY NAME

答案 1 :(得分:1)

另一个想法是pivot xml。在进一步处理中可能更容易阅读:

with data(name,
structure_code,
age_limit,
birthplace_limit) as
 (select 'RX ABS', 0123456, NULL, NULL
    from dual
  union all
  select 'RX ABS', 0999912, 50, NULL
    from dual
  union all
  select 'HEAD RESONANCE', 0999912, NULL, NULL
    from dual
  union all
  select 'ABS RESONANCE', 0123456, 30, NULL
    from dual
  union all
  select 'ABS RESONANCE', 0999912, NULL, 'ROME'
    from dual)
select *
  from data
pivot xml (max(age_limit) as age_limit, max(birthplace_limit) as birthplace_limit for structure_code in(any))
 order by name;

结果:

NAME            STRUCTURE_CODE_XML
ABS RESONANCE   <XMLTYPE>
HEAD RESONANCE  <XMLTYPE>
RX ABS          <XMLTYPE>

第二列包含xml格式的数据:

<PivotSet><item><column name = "STRUCTURE_CODE">123456</column><column name = "AGE_LIMIT">30</column><column name = "BIRTHPLACE_LIMIT"></column></item><item><column name = "STRUCTURE_CODE">999912</column><column name = "AGE_LIMIT"></column><column name = "BIRTHPLACE_LIMIT">ROME</column></item></PivotSet>