ORACLE 11g:不丢失差异的不同行(枢轴?)
ORACLE 11g: Distinct row without losing differences (pivot?)
我必须使用特定名称对行进行分组,而不会丢失特定列中的差异。
进行这样的查询,即搜索医疗程序和您可以执行它们的每个结构:
Select NAME, .... from TABLE (各种连接) 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 等...)。
我必须在网络上为每个不同的名称显示一行,然后指定每个结构的限制是什么(如果有的话)。我可以接受这样的字符串 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 将在呈现网页之前转换连接的字符串,以更易读的方式翻译它们。
这可能吗?或者您认为还有其他优雅的解决方案?
谢谢。
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
另一个想法是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>
我必须使用特定名称对行进行分组,而不会丢失特定列中的差异。
进行这样的查询,即搜索医疗程序和您可以执行它们的每个结构:
Select NAME, .... from TABLE (各种连接) 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 等...)。
我必须在网络上为每个不同的名称显示一行,然后指定每个结构的限制是什么(如果有的话)。我可以接受这样的字符串 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 将在呈现网页之前转换连接的字符串,以更易读的方式翻译它们。
这可能吗?或者您认为还有其他优雅的解决方案?
谢谢。
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
另一个想法是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>