过去两年我在Oracle SQL培训方面做了一些工作,这在我的工作中得到了很大的帮助(除了简单的选择,删除,更新,支点等,这不是我工作的重要部分) )。我最近收到的要求非常复杂,超出了我的技术能力,遗憾的是我无法获得可用的专业DBA来获得一些帮助。我需要一个oracle SQL脚本来恢复正确的数据和格式。
我所做的查询会带回所需的信息:
SELECT T1.ATTRIBUTE_1,
T1.ATTRIBUTE_2,
T1.ATTRIBUTE_3,
T1.COMMON_IDENTIFIER,
T2.ERROR,
T2.STATUS,
T2.TYPE
T2.TYPE_NUMBER
FROM TABLE_1 T1,
TABLE_2 T2
WHERE T1.COMMON_IDENTIFIER = T2.COMMON_IDENTIFIER;
这比我正在寻找的结果要简单得多但是我需要的所有数据都会得到这样的结果(我正在寻找的结果将由第三个表决定):
ATTRIBUTE_1 ATTRIBUTE_2 ATTRIBUTE_3 COMMON_IDENTIFER ERROR STATUS TYPE TYPE_NUMBER BLAH BLAH BLAH A1 E S TYPE i ####### BLAH BLAH BLAH A1 E S TYPE ii ####### BLAH BLAH BLAH A1 E S TYPE iii ####### BLAH BLAH BLAH A5 E S TYPE i ####### BLAH BLAH BLAH A5 E S TYPE ii ####### BLAH BLAH BLAH A7 E S TYPE i ####### BLAH BLAH BLAH A1 E S TYPE iv #######
我已经梳理了互联网,并找到了一个简单的例子,说明我正在寻找什么类型的行为:
Pivoting Data twice with dynamic sql and custom column names
我试图将其从SQL服务器转换为oracle,但它的速度很慢,我最终需要将该查询的结果与另一个表的结果结合起来。
我创建了一个查询,让我接近解决方案,但是它缺少给定TYPE的错误ERROR和STATUS数据以及相应的TYPE_NUMBER:
SELECT * FROM (
SELECT T1.COMMON_IDENTIFIER,
T2.TYPE,
T2.TYPE_NUMBER,
T2.ERROR,
T2.STATUS
FROM TABLE_1 T1, TABLE_2 T2
WHERE T1.COMMON_IDENTIFIER = T2.COMMON_IDENTIFIER
AND T2.TYPE IN ('TYPE i', 'TYPE ii', 'TYPE iii', 'TYPE iv'))
PIVOT (
MAX(TYPE_NUMBER) FOR TYPE IN ('TYPE i', 'TYPE ii', 'TYPE iii', 'TYPE iv')
)
结果如下:
COMMON_IDENTIFIER STATUS ERROR TYPE i TYPE ii TYPE iii TYPE iv A1 S E ####### ####### ####### ####### A5 S E ####### ####### A7 S E #######
这与我正在寻找的非常接近,但是对于给定的TYPE值(TYPE i,TYPE ii等),我缺少每个唯一TYPE_NUMBER的ERROR和STATUS数据。列标题'TYPE i','TYPE ii'等都需要是动态的,因为它们的值可以在任何给定时间更改并与第三个表绑定。
我需要一个oracle SQL查询,它会给我一些如下所示的结果:
ATTRIBUTE_1 ATTRIBUTE_2 ATTRIBUTE_3 COMMON_IDENTIFIER ERROR_i STATUS_i TYPE_i ERROR_ii STATUS_ii TYPE_ii ERROR_iii STATUS_iii TYPE_iii etc. BLAH BLAH BLAH A1 E S ####### E S ####### E S ####### BLAH BLAH BLAH A5 E S ####### E S ####### BLAH BLAH BLAH A7 E S #######
关于我正在寻找的结果的一些注释:
- 第一个查询中列TYPE的值,并在我正在寻找的第二个查询中用作标题,由用户有权访问的第三个表格决定,可以随时带走或添加值。例如在第一个查询中,列TYPE只有4个值,这可以随时更改。
- TYPE_NUMBER列值与TYPE值(TYPE i,TYPE ii等)以及ERROR和STATUS列的值特别关联。因此,如果用户在第三个表中创建新的TYPE值,我需要能够动态创建TYPE_XX,ERROR_XX和STATUS_XX列以适应更改。
就像我之前说的那样,超出了我的技术能力,我为任何冗余道歉。我没有对SQL进行任何正式的培训,因为它一直在工作,我只想在描述问题和我正在寻找的解决方案时尽可能清楚。
提前感谢您提供任何帮助!
答案 0 :(得分:0)
可以非常轻松地完成不同的ERROR
和STATUS
值:
SELECT * FROM (
SELECT T1.common_identifier, T2.type
, T2.type_number, T2.error, T2.status
FROM table_1 T1 INNER JOIN table_2 T2
ON t1.common_identifier = t2.common_identifier
WHERE t2.type IN ('TYPE i', 'TYPE ii', 'TYPE iii', 'TYPE iv')
) PIVOT (
MAX(error) AS error
, MAX(status) AS status
, MAX(type_number) AS type
FOR type IN ( 'TYPE i' AS i, 'TYPE ii' AS ii
, 'TYPE iii' AS iii, 'TYPE iv' AS iv )
)
列名称会有点时髦 - 例如,I_ERROR
而不是ERROR_I
- 但我认为你可以自己解决这个问题。
动态部分更难; PIVOT
本身并不适用于动态列表;您必须使用动态SQL - 例如在PL / SQL存储过程中 - 以实现此目的。