Oracle SQL запрос для получения еженедельных записей - PullRequest
0 голосов
/ 14 октября 2018

У меня есть таблица базы данных оракула 'my_table' с несколькими примерами строк следующим образом:

Case_ID Start_Date  End_Date    STATUS
123     01/10/2018  03/10/2018  Close
124     02/10/2018              Open
125     03/10/2018  05/10/2018  Close
126     04/10/2018              Open
127     05/10/2018  07/10/2018  Close
128     06/10/2018              Open
129     07/10/2018  09/10/2018  Close
130     08/10/2018  10/10/2018  Close
131     09/10/2018              Open

Я хочу получить вывод в следующем формате -

Week_No  Inflow Outflow  Total_Backlog
40       7       4       3
41       2       1       4

Как объединить следующие тризапросы, чтобы получить желаемый результат в вышеуказанном формате, используя один запрос?

 SELECT to_char(Start_Date,'IW') Week_No, count(CASE_ID) as Inflow 
   FROM my_table;

 SELECT to_char(End_Date,'IW') Week_No, count(CASE_ID) as Outflow  
   FROM my_table 
  WHERE status='Close';

 SELECT to_char(Start_Date,'IW') Week_No, count(CASE_ID) as Total_Backlog  
   FROM my_table 
  WHERE status <> 'Close';

1 Ответ

0 голосов
/ 14 октября 2018

Вы можете использовать:

select week_no, sum(nvl(Inflow,0)) as Inflow, 
                sum(nvl(Outflow,0)) as Outflow, 
                sum(nvl(Total_Backlog,0)) as Total_Backlog
  from               
   (
    select to_char(Start_Date,'IW') Week_No, 
           count(CASE_ID) as Inflow,
           ( case when STATUS != 'Close' then count(CASE_ID) end ) as Total_Backlog,
           null Outflow 
      from my_table
     group by to_char(Start_Date,'IW'), status
     union all
    select to_char(End_Date,'IW') Week_No, 
           null as Inflow, null as Total_Backlog,
           ( case when STATUS = 'Close' then count(CASE_ID) end ) as Outflow 
      from my_table
     where End_Date is not null
     group by to_char(End_Date,'IW'), status
    ) 
 group by week_no
 order by week_no;

 WEEK_NO    INFLOW  OUTFLOW TOTAL_BACKLOG
    40         7       3          3
    41         2       2          1

Rextester Demo

или вы можете предпочесть немного другоепуть как:

select week_no, sum(nvl(Inflow,0)) as Inflow, 
                sum(nvl(Outflow,0)) as Outflow, 
                sum(nvl(Total_Backlog,0)) as Total_Backlog
  from               
   (
    select to_char(Start_Date,'IW') Week_No, 
           count(CASE_ID) as Inflow,
           count( case when STATUS != 'Close' then CASE_ID end ) as Total_Backlog,
           null Outflow 
      from my_table
     group by to_char(Start_Date,'IW')
     union all
    select to_char(End_Date,'IW') Week_No, 
           null as Inflow, null as Total_Backlog,
           count( case when STATUS = 'Close' then CASE_ID end ) as Outflow 
      from my_table
     where End_Date is not null 
     group by to_char(End_Date,'IW')
    ) 
 group by week_no
 order by week_no;

 WEEK_NO    INFLOW  OUTFLOW TOTAL_BACKLOG
    40         7       3          3
    41         2       2          1
...