次のスクリプトがあります。
drop view proba;
create view proba as
select distinct oper as p_name
, sum(duration) as out_duration
from TA_OUT
where oper in ('CZE','FRA')
and timestamp like '201306%'
group by oper;
drop view proba1;
create view proba1 as
select distinct oper as p_name
,sum(duration) as in_duration
from TA_IN
where oper in ('CZE','FRA')
and timestamp like '201306%'
group by oper;
drop view proba3;
create view proba3 as
select distinct oper as p_name
,sum(duration) as out_duration
from TA_OUT
where oper in ('CZE','FRA')
and timestamp like '201305%'
group by oper;
drop view proba4;
create view proba4 as
select distinct oper as p_name
,sum(duration) as in_duration
from TA_IN
where oper in ('CZE','FRA')
and timestamp like '201305%'
group by oper;
drop view proba2;
create view proba2 as
select distinct oper as p_name
from OPER_DESCRIPTION;
このコードの考え方は、異なる月の期間を受け取り、その後次のコードでこの期間を比較することです。これが次のコードです。
drop view proba5;
CREATE VIEW proba5 AS
SELECT (BAL1 + BAL2) AS BAL
FROM
(
SELECT
CASE
WHEN proba.out_duration <= proba1.in_duration
AND proba.p_name IN ('CZE', 'FRA')
AND proba1.p_name IN ('CZE', 'FRA')
THEN (proba.out_duration / 60) * 0.14
WHEN proba.out_duration > proba1.in_duration
AND proba.p_name IN ('CZE', 'FRA')
AND proba1.p_name IN ('CZE', 'FRA')
THEN
(proba1.in_duration / 60) * 0.14
+
((proba.out_duration - proba1.in_duration) / 60) * 0.09
ELSE 0
END AS BAL1
, CASE
WHEN proba3.out_duration <= proba4.in_duration
AND proba3.p_name IN ('CZE', 'FRA')
AND proba4.p_name IN ('CZE', 'FRA')
THEN (proba3.out_duration / 60) * 0.14
WHEN proba3.out_duration > proba4.in_duration
AND proba3.p_name IN ('CZE', 'FRA')
AND proba4.p_name IN ('CZE', 'FRA')
THEN
(proba4.in_duration / 60) * 0.14
+ ((proba3.out_duration - proba4.in_duration) / 60) * 0.09
ELSE 0
END AS BAL2
FROM
(
(
(
(
proba2
LEFT JOIN proba
ON proba2.p_name = proba.p_name
)
LEFT JOIN proba1
ON proba1.p_name = proba1.p_name
LEFT JOIN proba3
ON proba3.p_name = proba3.p_name
)
LEFT JOIN proba4
ON proba4.p_name = proba4.p_name
)
WHERE proba.p_name IN ('CZE', 'FRA')
AND proba1.p_name IN ('CZE', 'FRA')
AND proba3.p_name IN ('CZE', 'FRA')
AND proba4.p_name IN ('CZE', 'FRA')
)
);
たとえば「CZE」などの 1 つの p_name を使用すると、正しい合計期間が表示されます。P_name ごとに個別の期間を受け取りたいです。例えば:
CZE 500
FRA 1300
ただし、問題は、期間によるグループも含める必要があるため、p_name のみでグループ化できないことです。
この問題を解決する方法を教えてください。