【问题标题】:Select columns as rows [duplicate]选择列作为行[重复]
【发布时间】:2013-07-25 20:47:37
【问题描述】:
select * from emp14;

输出:

EMPLOYEE_ID FIRST_NAME  LAST_NAME   EMAIL   
100          Steven            King         SKING   

我想按列显示输出,如下所示:

EMPLOYEE_ID  100
FIRST_NAME   Steven
LAST_NAME    King
EMAIL        SKING

【问题讨论】:

  • 该链接可能不是您想要的。但是这个问题经常被问到,如果你搜索 SO,你会找到你需要的。 stackoverflow.com/questions/tagged/…
  • @APC 我认为重复是错误的,OP 想要取消透视而不是透视数据。
  • @bluefeet - 我同意,你的建议更相关

标签: sql oracle pivot


【解决方案1】:

试试这个

SELECT col, val
FROM
(
  SELECT to_char(EMPLOYEE_ID) AS EMPLOYEE_ID,FIRST_NAME,LAST_NAME, EMAIL FROM emp14
)t 
UNPIVOT INCLUDE NULLS
( 
  VAL FOR col IN (EMPLOYEE_ID,FIRST_NAME,LAST_NAME, EMAIL)
);

SQL FIDDLE DEMO

【讨论】:

  • +1 这是最简洁的解决方案 - 前提是 OP 是 11g 或更高版本
【解决方案2】:

您似乎希望每列显示在单独的行上。运行 SELECT 语句的结果将以用于运行查询的特定工具选择的任何方式显示。如果您真的希望每列显示在单独的行上,您可以使用一点 PL/SQL:

BEGIN
  FOR aRow IN (SELECT * FROM EMP14) LOOP
    DBMS_OUTPUT.PUT_LINE('EMPLOYEE_ID  ' || aRow.EMPLOYEE_ID);
    DBMS_OUTPUT.PUT_LINE('FIRST_NAME   ' || aRow.FIRST_NAME);
    DBMS_OUTPUT.PUT_LINE('LAST_NAME    ' || aRow.LAST_NAME);
    DBMS_OUTPUT.PUT_LINE('EMAIL        ' || aRow.EMAIL);
  END LOOP;
END;

分享和享受。

【讨论】:

    【解决方案3】:

    另一种方法:

    -- this type is going to contain value's name and the value itself
    SQL> create type t_data is object(
      2    col1 varchar2(31),
      3    col2 varchar2(31)
      4  );
      5  /
    
    Type created
    
    
    SQL> create type t_table is table of t_data;
      2  /
    
    Type created
    

    之后,可以通过以下方式构造查询:

    -- sample of data from the question + some extra  data 
    -- just for the sake of demonstration.
    SQL> with t1(EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL) as
      2  (  select 100, 'Steven', 'King', 'SKING' from dual union all
      3     select 101, 'Steven1', 'King1', 'SKING1' from dual
      4   )
      5  select col1
      6       , col2
      7    from t1 t
      8    cross join table(
      9                     t_table( t_data('Employee_id', t.employee_id)
     10                             , t_data('First_name', t.first_name)
     11                             , t_data('Last_Name' , t.last_name)
     12                             , t_data('e-mail'    , t.email)
     13                             )
     14                     )
     15  ;
    

    结果:

    COL1                            COL2
    ------------------------------- -------------------------------
    Employee_id                     100
    First_name                      Steven
    Last_Name                       King
    e-mail                          SKING
    Employee_id                     101
    First_name                      Steven1
    Last_Name                       King1
    e-mail                          SKING1
    
    8 rows selected
    

    【讨论】:

      【解决方案4】:
      select concat('EMPLOYEE_ID ', EMPLOYEE_ID) as EMPLOYEE_ID,
             concat( 'FIRST_NAME ' ,   FIRST_NAME) as FIRST_NAME,
             concat('LAST_NAME ' ,  LAST_NAME) as LAST_NAME,
             concat('EMAIL ' , EMAIL)  as EMAIL 
      from email
      

      【讨论】:

      • 供将来参考,+ 在 Oracle 中不是一个有价值的连接运算符。
      • 返回一行。 OP想要“列作为行”。
      • 没错,我是按照mysql写的。
      • 不,我想在 Sql 本身而不是在 pl/sql 中执行此操作...在 sql 中,我们有行到列功能...使用我们可以...
      • RAMKUMAR - 我认为您评论了错误的帖子。这似乎是针对@BobJarvis
      猜你喜欢
      • 2011-12-29
      • 2013-11-28
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2010-12-07
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      相关资源
      最近更新 更多