-1

Oracleデータベースに以下に示すようなデータを含むテーブルがあります。

emp_num  person_name  organization  earned_date  sum(hours)
-------  -----------  ------------  -----------  ----------
36372    Name1        Test1         23-MAR-11      3.17
36372    Name1        Test1         15-MAR-11      6.70
40208    Name2        Test2         08-APR-11     13.50
40208    Name2        Test2         06-APR-11     12.07

以下のようにクエリ出力を変更する必要があります。どうやってやるの?

emp_num  person_name  organization  23-MAR-11  15-MAR-11  08-APR-11  06-APR-11
-------  -----------  ------------  ---------  ---------  ---------  ---------
36372     Name1       Test1           3.17        6.70      
40208     Name2       Test2                                 13.50      12.70     
4

2 に答える 2

1

なんらかの形式の動的 SQL を使用しない限り、テーブル内の列に動的に名前を付けることはできません。ただし、一般的な日付列を使用して必要なものを取得できます。

select emp_num, person_name, organization, 
       sum(decode(datenum, 1, hours, 0)) as date1hours,
       sum(decode(datenum, 2, hours, 0)) as date2hours,
       ...
       min(decode(datenum, 1, earned_date) as date1,
       min(decode(datenum, 2, earned_date) as date2,
       ...
from 
(
  select t.*, 
     dense_rank() over (partition by NULL order by earned_date) as datenum
  from the_table t
) t
group by emp_num, person_name, organization 

ちなみに、Oracle 10g はCASE構文をサポートしているので、代わりにそれを使用することをお勧めしますdecode

于 2012-05-08T13:27:10.840 に答える
0
select
  emp_num,
  person_name,
  organization,
  sum(decode(earned_date,to_date('23/03/2011','dd/mm/yyyy'),hours,0)) 23mar11,
  sum(decode(earned_date,to_date('15/03/2011','dd/mm/yyyy'),hours,0)) 15mar11,
  sum(decode(earned_date,to_date('08/04/2011','dd/mm/yyyy'),hours,0)) 08apr11,
  sum(decode(earned_date,to_date('06/04/2011','dd/mm/yyyy'),hours,0)) 06apr11
from
  the_table //don't know the name
group by
  emp_num,
  person_name,
  organization

日付と文字列を比較するには、常に to_date 関数を使用します。ここでは、一般的な英国形式を使用しています。

于 2012-05-08T12:24:59.733 に答える