在单行中获取不同的列值

pun*_*289 4 sql oracle pivot unpivot oracle10g

这是数据:

id    name     period      data1    data2
===================================================
111   name1    monthly     aaaaa    bbbbb
111   name1    quaterly    ccccc    ddddd
111   name1    halfYearly  eeeee    fffff
111   name1    annually    ggggg    hhhhh
Run Code Online (Sandbox Code Playgroud)

我想查询在一行中获取数据的查询

id    name     monthlYdata1    monthlYdata2      quaterlydata1    quaterlydata2      halfYearlydata1    halfYearlydata2      annuallydata1    annuallydata2
==========================================================================================================================================================
111   name1    aaaaa           bbbbb             ccccc            ddddd              eeeee              fffff                ggggg            hhhhh
Run Code Online (Sandbox Code Playgroud)

Tar*_*ryn 7

您没有指定您正在使用的RDBMS,但这将适用于所有这些:

select id,
  name,
  max(case when period = 'monthly' then data1 end) as MonthlyData1,
  max(case when period = 'monthly' then data2 end) as MonthlyData2,
  max(case when period = 'quaterly' then data1 end) as quarterlyData1,
  max(case when period = 'quaterly' then data2 end) as quarterlyData2,
  max(case when period = 'halfYearly' then data1 end) as halfYearlyData1,
  max(case when period = 'halfYearly' then data2 end) as halfYearlyData2,
  max(case when period = 'annually' then data1 end) as annuallyData1,
  max(case when period = 'annually' then data2 end) as annuallyData2
from yourtable
group by id, name
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

如果您正在使用具有PIVOT函数的RDBMS ,那么您可以执行以下操作,同时使用UNPIVOTPIVOT生成结果.由于舍甫琴科中号指出UNPIVOT是假设两者的数据类型data1data2是同一类型的,如果没有,那么转换需要采取地方UNPIVOT数据:

Oracle 11g:

select *
from
(
  select id, name, value, 
    period||data new_col
  from yourtable
  unpivot
  (
    value for data in (data1, data2)
  ) u
) x
pivot
(
  max(value)
  for new_col in ('monthlyDATA1', 'monthlyDATA2',
                  'quaterlyDATA1', 'quaterlyDATA2',
                  'halfYearlyDATA1', 'halfYearlyDATA2',
                  'annuallyDATA1', 'annuallyDATA2')
) p
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

SQL Server:

select *
from
(
  select id, name, value, 
    period+data new_col
  from yourtable
  unpivot
  (
    value for data in (data1, data2)
  ) u
) x
pivot
(
  max(value)
  for new_col in ('monthlyDATA1', 'monthlyDATA2',
                  'quaterlyDATA1', 'quaterlyDATA2',
                  'halfYearlyDATA1', 'halfYearlyDATA2',
                  'annuallyDATA1', 'annuallyDATA2')
) p
Run Code Online (Sandbox Code Playgroud)