2017-04-14 16 views
0
select (select SUM(t.fees_amount)from unit u, payment p, type_of_fees t WHERE u.unit_id = p.unit_id AND p.stof = t.stof AND u.unit_id LIKE '%U1001%' 
     AND p.stat = 'not payed') "BLOCK 1(Not Payed)", 

     (select SUM(t.fees_amount)from unit u, payment p, type_of_fees t WHERE u.unit_id = p.unit_id AND p.stof = t.stof AND u.unit_id LIKE '%U1001%' 
     AND p.stat = 'payed') "BLOCK 1(Payed)", 

     (select SUM(t.fees_amount)from unit u, payment p, type_of_fees t WHERE u.unit_id = p.unit_id AND p.stof = t.stof AND u.unit_id LIKE '%U1002%' 
     AND p.stat = 'not payed') "BLOCK 2(Not Payed)", 

     (select SUM(t.fees_amount)from unit u, payment p, type_of_fees t WHERE u.unit_id = p.unit_id AND p.stof = t.stof AND u.unit_id LIKE '%U1002%' 
     AND p.stat = 'payed') "BLOCK 2(Payed)" 

from dual; 

これに対処する方法はありますか?oracle sql plusスクリプトが長すぎます

答えて

1

あなたはこのために、条件付き集約を使用することができます。

select sum(case when u.unit_id like '%U1001%' and p.stat = 'not payed' then t.fees_amount else 0 end) as "BLOCK 1(Not Payed)", 
    sum(case when u.unit_id like '%U1001%' and p.stat = 'payed' then t.fees_amount else 0 end) as "BLOCK 1(Payed)", 
    sum(case when u.unit_id like '%U1002%' and p.stat = 'not payed' then t.fees_amount else 0 end) as "BLOCK 2(Not Payed)", 
    sum(case when u.unit_id like '%U1002%' and p.stat = 'payed' then t.fees_amount else 0 end) as "BLOCK 2(Payed)" 
from unit u 
join payment p on u.unit_id = p.unit_id 
join type_of_fees t on p.stof = t.stof; 

はまた、あなたがいつも代わりに古いコンマベースの結合の結合構文を明示的に使用する必要があります。

+0

私のデータベースのデザインが悪いので、これは長いですか? – user7868404

+0

@ user7868404 - 私はそれが要件だと思う。 'like'を使う必要があるので、クエリは遅くなる可能性があります。私はあなたの4つの選択肢を1つにまとめることができましたが。 – GurV

関連する問題