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。最好是在行(而不是列)中返回值,然后将其转换为显示结果所用的任何前端中的列。