0

私はこのようなデータセットを持っています

id        subid        date(in yyyymmdd)  time(in hh24miss)  count1  count2
80013727  20000000431  20120429           001500             0       0
80013727  20000000431  20120429           003000             0       0
80013729  20000000432  20120429           001500             0       0
80013729  20000000432  20120429           003000             0       0
80013728  20000000435  20120429           001500             0       0
80013728  20000000435  20120429           003000             0       0

ご覧のとおり、時間は 15 分刻みです。以下のような結果セットを出力したいと思います。

id        Date      subid        00:00:00-00:14:59  00:15:00-00:29:59    
80013727  20120429  20000000431  0                  0
80013729  20120429  20000000432  0                  0

ご覧のとおり、ID 80013727 に関連するすべてのデータが、日付 20120429 の 2 行ではなく 1 行に表示されています。

それを達成する方法を教えてください。

ヘッダー行は、dbms_output.put_line を使用して 1 回出力できます。

こんにちはここにあなたの答えがあります-

オラクル版 10.2g

一意の ID、サブ ID、日付の組み合わせの場合、count1 と count2 を 1 行に表示する必要があります。一番上の結果セットから見ることができる4行の代わりに。

80013727 20000000431 20120429 には異なる時間の 2 つの行があります (つまり、015000,030000)

私は示す必要があります

80013727 20000000431 20120429 count1(1行目から),count1(2行目から)

80013727 20000000431 20120429 count2(1行目から),count2(2行目から)

4

1 に答える 1

0

明らかに、データと出力構造が単純化されました。最終的には 96 カウントの列になると思います (ただし、そこまで行くつもりはありません)。

with cte as
     ( select * from your_table ) 
select id
       ,  subid
       ,  date
           ,  type
           ,  sum(c01) as "00:00:00-00:14:59" 
           ,  sum(c02) as "00:15:00-00:29:59" 
           ,  sum(c96) as "23:45:00-23:59:59" 
from (
    select id
           ,  subid
           ,  date
           ,  'C1' type
           ,  case when time between 0 and 899 then count1 else 0 end as c01 
           ,  case when time between 900 and 1799 then count1 else 0 end as c02
           ,  case when time between 85500 and 86399 then count1 else 0 end as c96
from cte
    union all
    select id
           ,  subid
           ,  date
           ,  'C2' type
           ,  case when time between 0 and 899 then count2 else 0 end as c01 
           ,  case when time between 900 and 1799 then count2 else 0 end as c02
           ,  case when time between 85500 and 86399 then count2 else 0 end as c96
    ) 
group by id, subid, date, type
order by id, subid, date, type

したがって、これはサブクエリの因数分解式を使用して、テーブルから 1 回だけ選択します。case()秒の範囲に基づいて、特定の時間列にカウントを割り当てるために使用します。行 1 と 2 のカウントを集計する 2 つのクエリがあります。

呼び出しはsum()不要な場合があります。各タイムスロットに複数のレコードがあるかどうかは、データからは明らかではありません。

于 2012-05-07T13:07:41.767 に答える