【问题标题】:Oracle PIVOT, twice?Oracle PIVOT,两次?
【发布时间】:2011-03-12 23:39:58
【问题描述】:

我一直试图在 Oracle 11g 中不再使用 DECODE 来对行进行透视,其中有一个方便的 PIVOT 函数。但我可能发现了一个限制:

我正在尝试为基表中的每个值返回 2 列。比如:

SELECT somethingId, splitId1, splitName1, splitId2, splitName2
FROM (SELECT somethingId, splitId
      FROM SOMETHING JOIN SPLIT ON ... )
      PIVOT ( MAX(splitId) FOR displayOrder IN (1 AS splitId1, 2 AS splitId2),
              MAX(splitName) FOR displayOrder IN (1 AS splitName1, 2 as splitName2)
            )

我可以使用 DECODE 来做到这一点,但我无法掌握让我使用 PIVOT 来做到这一点的语法。这甚至可能吗?看起来这个函数处理起来不会太难。

编辑:StackOverflow 是否可能不是 SQL 问题的正确溢出?

编辑:有人在吗?

【问题讨论】:

  • 来吧,有没有是或否的答案?我是在错误的 Oracle SQL 论坛上吗?
  • 不幸的是,PIVOT 在 Oracle 中非常新,似乎这里的大多数人都没有足够的知识来回答您的问题。您如何尝试在 forums.oracle.com 上发帖?去那里的 Oracle 专家比来这里的多。
  • 你的问题在添加“oracle”标签的那一刻就出现在我的列表中:)

标签: sql oracle pivot oracle11g


【解决方案1】:

我不确定您提供的数据是什么样的,或者您到底想要什么。也许如果您发布了返回您正在查找的数据和/或源数据定义的查询的解码版本,我们可以更好地回答您的问题。这样的事情会有所帮助:

create table something (somethingId Number(3), displayOrder Number(3)
   , splitID Number(3));            
insert into something values (1, 1, 10);
insert into something values (2, 1, 11);
insert into something values (3, 1, 12);
insert into something values (4, 1, 13);
insert into something values (5, 2, 14);
insert into something values (6, 2, 15);
insert into something values (7, 2, 16);

create table split (SplitID Number(3), SplitName Varchar2(30));
insert into split values (10, 'Bob');
insert into split values (11, 'Carrie');
insert into split values (12, 'Alice');
insert into split values (13, 'Timothy');
insert into split values (14, 'Sue');
insert into split values (15, 'Peter');
insert into split values (16, 'Adam');

SELECT * 
FROM (
   SELECT somethingID, displayOrder, so.SplitID, sp.splitname
      FROM SOMETHING so JOIN SPLIT sp ON so.splitID = sp.SplitID
)
PIVOT ( MAX(splitId) id,  MAX(splitName) name
   FOR (displayOrder, displayOrder) IN ((1, 1) AS split, (2, 2) as splitname)
);

【讨论】:

    【解决方案2】:

    oracle-developer.net看来,可以这样完成:

    SELECT somethingId, splitId1, splitName1, splitId2, splitName2
    FROM (SELECT somethingId, splitId
          FROM SOMETHING JOIN SPLIT ON ... )
          PIVOT ( MAX(splitId)  ,
                  MAX(splitName) 
                  FOR displayOrder IN (1 AS splitName1, 2 as splitName2)
                )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多