Oracle 在resultset中生成动态列
我试图根据表中存在的行动态生成列 我有一张像下面这样的桌子-Oracle 在resultset中生成动态列,oracle,Oracle,我试图根据表中存在的行动态生成列 我有一张像下面这样的桌子- Name | Sub | Marks A |Hindi |59 A |Eng |88 A |Maths |68 Name | Sub | Marks | Sub | Marks | Sub | Marks A |Hindi |59 |Eng |88 |Maths |68 但是,我需要如下结果- Name |
Name | Sub | Marks
A |Hindi |59
A |Eng |88
A |Maths |68
Name | Sub | Marks | Sub | Marks | Sub | Marks
A |Hindi |59 |Eng |88 |Maths |68
但是,我需要如下结果-
Name | Sub | Marks
A |Hindi |59
A |Eng |88
A |Maths |68
Name | Sub | Marks | Sub | Marks | Sub | Marks
A |Hindi |59 |Eng |88 |Maths |68
我不知道如何实现同样的目标。非常感谢您的帮助。
Oracle 11g R2架构设置:
CREATE TABLE table_name ( Name, Sub, Marks ) AS
SELECT 'A', 'Hindi', 59 FROM DUAL UNION ALL
SELECT 'A', 'Eng', 88 FROM DUAL UNION ALL
SELECT 'A', 'Maths', 68 FROM DUAL;
SELECT *
FROM (
SELECT t.*,
ROW_NUMBER() OVER ( PARTITION BY name ORDER BY ROWNUM ) AS rn
FROM table_name t
)
PIVOT (
MAX( Sub ) AS SUB,
MAX( Marks ) AS Marks
FOR rn IN ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 )
)
| NAME | 1_SUB | 1_MARKS | 2_SUB | 2_MARKS | 3_SUB | 3_MARKS | 4_SUB | 4_MARKS | 5_SUB | 5_MARKS | 6_SUB | 6_MARKS | 7_SUB | 7_MARKS | 8_SUB | 8_MARKS | 9_SUB | 9_MARKS | 10_SUB | 10_MARKS |
|------|-------|---------|-------|---------|-------|---------|--------|---------|--------|---------|--------|---------|--------|---------|--------|---------|--------|---------|--------|----------|
| A | Hindi | 59 | Eng | 88 | Maths | 68 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
查询1:
CREATE TABLE table_name ( Name, Sub, Marks ) AS
SELECT 'A', 'Hindi', 59 FROM DUAL UNION ALL
SELECT 'A', 'Eng', 88 FROM DUAL UNION ALL
SELECT 'A', 'Maths', 68 FROM DUAL;
SELECT *
FROM (
SELECT t.*,
ROW_NUMBER() OVER ( PARTITION BY name ORDER BY ROWNUM ) AS rn
FROM table_name t
)
PIVOT (
MAX( Sub ) AS SUB,
MAX( Marks ) AS Marks
FOR rn IN ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 )
)
| NAME | 1_SUB | 1_MARKS | 2_SUB | 2_MARKS | 3_SUB | 3_MARKS | 4_SUB | 4_MARKS | 5_SUB | 5_MARKS | 6_SUB | 6_MARKS | 7_SUB | 7_MARKS | 8_SUB | 8_MARKS | 9_SUB | 9_MARKS | 10_SUB | 10_MARKS |
|------|-------|---------|-------|---------|-------|---------|--------|---------|--------|---------|--------|---------|--------|---------|--------|---------|--------|---------|--------|----------|
| A | Hindi | 59 | Eng | 88 | Maths | 68 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
:
CREATE TABLE table_name ( Name, Sub, Marks ) AS
SELECT 'A', 'Hindi', 59 FROM DUAL UNION ALL
SELECT 'A', 'Eng', 88 FROM DUAL UNION ALL
SELECT 'A', 'Maths', 68 FROM DUAL;
SELECT *
FROM (
SELECT t.*,
ROW_NUMBER() OVER ( PARTITION BY name ORDER BY ROWNUM ) AS rn
FROM table_name t
)
PIVOT (
MAX( Sub ) AS SUB,
MAX( Marks ) AS Marks
FOR rn IN ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 )
)
| NAME | 1_SUB | 1_MARKS | 2_SUB | 2_MARKS | 3_SUB | 3_MARKS | 4_SUB | 4_MARKS | 5_SUB | 5_MARKS | 6_SUB | 6_MARKS | 7_SUB | 7_MARKS | 8_SUB | 8_MARKS | 9_SUB | 9_MARKS | 10_SUB | 10_MARKS |
|------|-------|---------|-------|---------|-------|---------|--------|---------|--------|---------|--------|---------|--------|---------|--------|---------|--------|---------|--------|----------|
| A | Hindi | 59 | Eng | 88 | Maths | 68 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
是否总是有三个栏目/主题,或者这个数字是可变的?这对我来说是最大的挑战。这些行可以是动态的。有时是2,有时是10。对于动态
pivot
,有多少问题被问到,这很有趣,但不幸的是,除了xml或构造列并运行动态sql之外,还没有一种简单的方法@KaushikNayak,这永远不会是我的解决方案,因为我不希望值变成列,而是希望添加更多同名的列。是否可以对该查询进行更多修改,以仅包含列,直到值为非空?例如,在这种情况下,直到3_sub,3_marks@AnkitBajpai否,查询中需要有已知(固定)列数。如果需要动态的列数,则需要使用动态SQL。最好是在行(而不是列)中返回值,然后将其转换为显示结果所用的任何前端中的列。