【问题标题】:Transpose column with rows用行转置列
【发布时间】:2013-03-27 14:45:57
【问题描述】:

我有一个很长的查询会产生一些值。标识符名称太长。而且我更喜欢将结果集放在名为“列名”和“列值”的 2 列中。

我想要的以下查询的IE:

column name               column value
forn_old_codice_fornitura ***
VOF_VOCE_FATTURABILE_COD  ***
IEF_ASSOGGETTAMENTO_COD   ***

***是实际值。

我该怎么办?

SELECT 
      forn.forn_old_codice_fornitura,

'列描述1', VOF.VOF_VOCE_FATTURABILE_COD, '列描述 2', IEF_ASSOGGETTAMENTO_COD "Cod Assog Neta", '列描述 3' [...]

【问题讨论】:

    标签: oracle oracle11g unpivot


    【解决方案1】:

    由于您使用的是 Oracle 11g,因此您可以使用 UNPIVOT 函数。这会将您的列转换为行:

    select col_name , col_value
    from
    (
      SELECT 
            forn.forn_old_codice_fornitura,
             VOF.VOF_VOCE_FATTURABILE_COD,
             IEF_ASSOGGETTAMENTO_COD,
             ETA.ETA_CODICE_ASSOG,
             CLU.CLU_CLASSE_FORNITURA_COD,
             MVI.CLU_CLASSE_FORNITURA_COD,
             ETA.ETA_USO_CLASSE_FORN,
             MVI.MVI_FLG_SOGGETTO,
             ETA.ETA_FLG_SOGGETTO,
      [...]
    ) 
    unpivot
    (
      col_value
      for col_name in (forn_old_codice_fornitura, VOF_VOCE_FATTURABILE_COD,
                       IEF_ASSOGGETTAMENTO_COD, ETA_CODICE_ASSOG, ...)
    ) 
    

    编辑,根据您想要生成具有列长名称的列描述的评论,您可以通过两种方式执行此操作。

    一,您可以使用CASE 表达式,将col_name 替换为您想要的列描述,类似于:

    select col_name, 
      col_value,
      case col_name
        when 'col1' then 'Test Col 1'
        when 'col2' then 'Test Col 2'
        when 'col3' then 'Test Col 3'
        when 'col4' then 'Test Col 4'
      end col_desc
    from yourtable
    unpivot
    (
      col_value
      for col_name in (col1, col2, col3, col4)
    ) unp;
    

    或者您可以创建一个包含从col_name 到列描述的转换的表,并将该表连接到反透视结果:

    select d.col_name,
      d.col_value,
      cd.col_desc
    from
    (
      select col_name, 
        col_value
      from yourtable
      unpivot
      (
        col_value
        for col_name in (col1, col2, col3, col4)
      ) unp
    ) d
    inner join cd
      on d.col_name = cd.col_name
    

    参见SQL Fiddle with Demo 两者

    【讨论】:

    • 如果我想添加包含长名称的第三列? IE。 col_name , col_value, col_description 有没有可能
    • @Gik25 栏目描述从何而来?
    • 我会将其插入到原始查询中。我将修改初始示例以向您展示
    • @Gik25 查看我的编辑。有两种方法可以使用CASE 创建列描述,或者使用可用于转换的列描述和名称创建表。
    猜你喜欢
    • 2022-11-17
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    相关资源
    最近更新 更多