0

いくつかの値を生成する長いクエリがあります。識別子名が長すぎます。そして、結果セットを「列名」と「列値」という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「たらこネタ」、「コラム説明3」 [...]

4

1 に答える 1

5

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, ...)
) 

編集、列の長い名前で列の説明を生成したいというコメントに基づいて、これを行うには2つの方法があります。

1 つ目は、次のように、必要な列の説明に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 を参照してください

于 2013-03-27T14:51:39.530 に答える