「テスト」の3つの列を1つにアンピボットすることができます。これは本質的にあなたのユニオンがやっていることです。それをあなたが望む列に戻します(あなたが11g以上であると仮定して)。 CTEでのサンプルデータで:日付でフィルタリングするに
with orders (ID, DT, CLIENT, TEST0, TEST1, TEST2) as (
select 1, date '2017-04-12', 123, 'CBC', 'LIPID', null from dual
union all select 2, date '2017-04-12', 345, 'LIPID', null, null from dual
union all select 3, date '2017-04-13', 123, 'BMP', 'CBC', null from dual
union all select 4, date '2017-04-13', 345, 'TSH', 'LIPID', null from dual
)
select * from (
select client, test
from orders
unpivot (test for num in (test0 as '0', test1 as '1', test2 as '2'))
)
pivot (count(test) as cnt for (test)
in ('CBC' as cbc, 'LIPID' as lipid, 'BMP' as bmp, 'TSH' as tsh));
CLIENT CBC_CNT LIPID_CNT BMP_CNT TSH_CNT
---------- ---------- ---------- ---------- ----------
123 2 1 1 0
345 0 2 0 1
、行は表から選んだrestircts別のサブクエリにfrom orders
を変更する、と言います。別のテーブルに結果を結合し、どちらかその内側のクエリ内での参加、または全部内側のクエリの別のレベル、のようなものにするには:時間内に単一の値のみ欄に表示されることができる場合
select c.client_name, o.cbc_cnt, o.lpid_cnt, o.dmp_cnt, o.tsh_cnt
from (
select * from (
select client, test
from (
select *
from orders
where dt = date '2017-04-12'
)
unpivot (test for num in (test0 as '0', test1 as '1', test2 as '2'))
)
pivot (count(test) as cnt for (test)
in ('CBC' as cbc, 'LIPID' as lipid, 'BMP' as bmp, 'TSH' as tsh))
) o
join your_client_table c on c.client = o.client;
を行 - あなたはTEST0およびTEST1の両方を持つ行を持って、両方のCBCに設定し、例えばことができませんでした - あなたは、より簡単に行うことができます:
select client,
count(case when test0 = 'CBC' or test1 = 'CBC' or test2 = 'CBC' then client end) as cbc,
count(case when test0 = 'LIPID' or test1 = 'LIPID' or test2 = 'LIPID' then client end) as lipid,
count(case when test0 = 'BMP' or test1 = 'BMP' or test2 = 'BMP' then client end) as bmp,
count(case when test0 = 'TSH' or test1 = 'TSH' or test2 = 'TSH' then client end) as tsh
from orders
group by client;
CLIENT CBC LIPID BMP TSH
---------- ---------- ---------- ---------- ----------
123 2 1 1 0
345 0 2 0 1
をそうであることは明らかではありません。特定の日付範囲を探しているクエリのために