2016-05-30 6 views
0

同じBNに対して複数のエントリ(行)を作成するのではなく、FC、FM、MSの値で同じ行にエントリを作成する必要があります。oracle sqlの単一行で複数の行が共通

select bspt.BN, FC, FM, MS from(select distinct(ozt.BRD_ID), 
bp.NAME as BN, 
os.OSS FC, '' FM, '' MS 
from PR_BP ozt, PR_BP_BPP bp, BDD b, OS_VIEW os 
where bp.BRD_ID = ozt.BRD_ID AND ozt.BRD_ID = os.OBJECT_ID and 
os.OST = 'PR_BP_BPP' AND (ozt.BID = 10001) 
and ozt.BID = b.BID AND ozt.BP_ACTIVE = 'Y' 
UNION ALL 
select distinct(ozt.BRD_ID), 
bp.NAME as BN, 
'' FC, os.OST FM, '' MS 
from PR_BP ozt, PR_BP_BPP bp, BRAND b, OS_VIEW os 
where bp.BRD_ID = ozt.BRD_ID AND ozt.BRD_ID = os.OBJECT_ID and 
os.OST = 'PR_BP_BPP' AND (ozt.BID = 10002) 
and ozt.BID = b.BID AND ozt.BP_ACTIVE = 'Y' 

上記のクエリは、BNAME列に対して複数のエントリを持つ出力を生成しています。したがって、別々のエントリを作成する代わりに、共通のBNAMEに対して1つの行のみを作成する必要があります。

+0

したがって、あなたの例では、結果に含まれるべき2つの行のうち、どちらが含まれていてもいけませんか?どのような一般的な論理に基づいて、それはすべての同様の可能な重複に適用されますか? (ルールは "それに依存する"ことはできません - 結果テーブルを見ることなくそれを記述できる必要があります) – mathguy

+0

共通のBIZNAMEの1行にする必要があります。出力は上記の結果になるはずですトップアップ(自己勘定残高駆動型または月単位)NN(null) – Andrew

答えて

1

このすべては、条件付き集計を使用する1つのクエリで実行できます。

select bp.NAME as BIZNAME, 
max(case when bbp.BRAND_ID = 10001 then os.OBJECT_STATUS end) FC, 
max(case when bbp.BRAND_ID = 10002 then os.OBJECT_STATUS end) FM, 
max(case when bbp.BRAND_ID = 10007 then os.OBJECT_STATUS end) MS 
from PR_BP bbp 
JOIN PR_BP_BPP bp ON bp.BP_ID = bbp.BP_ID 
JOIN BRAND b ON bbp.BRAND_ID = b.BRAND_ID 
JOIN OS_VIEW os ON bbp.BP_ID = os.OBJECT_ID 
where os.OBJECT_TYPE = 'PR_BP_BPP' AND bbp.BP_ACTIVE = 'Y' 
group by bp.NAME 
関連する問題