4

これはデータです:

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

のような単一の行でデータを取得するクエリが必要です

id    name     monthlYdata1    monthlYdata2      quaterlydata1    quaterlydata2      halfYearlydata1    halfYearlydata2      annuallydata1    annuallydata2
==========================================================================================================================================================
111   name1    aaaaa           bbbbb             ccccc            ddddd              eeeee              fffff                ggggg            hhhhh
4

4 に答える 4

7

使用している RDBMS を指定しませんでしたが、これはすべての 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

デモで SQL Fiddle を参照してください

PIVOT関数を持つ RDBMS を使用している場合は、UNPIVOTとの両方を使用PIVOTして結果を生成する次の操作を実行できます。Andriy M が指摘したように、とUNPIVOTの両方のデータ型が同じ型であると仮定しているため、そうでない場合は、データに変換を行う必要があります。data1data2UNPIVOT

オラクル 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

デモで SQL Fiddle を参照してください

SQLサーバー:

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
于 2012-10-29T13:03:16.350 に答える
0

まず、すべての異なる ID を一時テーブルに取得する必要があります。

Select DISTINCT id
into #tmpIds
from Table

次に、必要な列 ( idnamemonthlYdata1monthlYdata2quaterlydata1quaterlydata2halfYearlydata1、 )を含む一時テーブルを作成しhalfYearlydata2、最初の一時テーブルをループして ID を取得します。annuallydata1annuallydata2

各IDに対して、次のことを行う必要があります。

Insert into #tmpTable
   @id,
   '',
  (Select data1 from Table where id=@id and period='monthly') as monthlyData1
  ...

これが私の頭に浮かんだ最初の解決策です。

于 2012-10-29T12:58:02.213 に答える
0

クエリ自体からデータを取得します。

クエリ 1 から ID と名前を取得し、クエリ 1 から取得した ID を使用して、そのクエリを月次、四半期、年次のデータと連結します。

于 2012-10-29T12:39:50.340 に答える
0

3つはあなたの質問に完全な記事を使用します:

MySQL で行を列として表示する方法は?

MySQL エンティティ属性値スキーマをピボットする方法

http://forums.mysql.com/read.php?20,75357,75357#msg-75357

于 2012-10-29T12:57:16.500 に答える