代码之家  ›  专栏  ›  技术社区  ›  orbfish

Oracle PIVOT,两次?

  •  2
  • orbfish  · 技术社区  · 15 年前

    我一直在尝试摆脱在oracle11g中使用DECODE来透视行的做法,在oracle11g中有一个方便的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问题的正确溢出吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Tony Andrews    14 年前

    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)
                )
    
        2
  •  1
  •   Leigh Riffel    14 年前

    从你提供的数据来看,我不确定你到底想要什么。如果您发布了返回您要查找的数据和/或源数据定义的查询的解码版本,我们可能会更好地回答您的问题。这样做会很有帮助:

    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)
    );