找出特定范围内年龄组的平均贷款并将其显示在 table 中

Find out average loan taken by age group in specific ranges and display them in a table

考虑以下 2 tables:

customer( **c_id**, c_name, c_dob)
customer_loan_taken( **loan_no**, c_id, taken_date, loan_amount) 

如何找出 20-25 岁、30-35 岁、40-45 岁年龄组的平均贷款,并在一个 table 中显示?

table内容如下:

顾客table

  C_ID C_NAME                         C_DOB

     1 Jainam Jhaveri                 17-FEB-93
     2 Harsh Mehra                    10-DEC-91
     3 Mohit Desai                    15-OCT-75
     4 Raj Gupta                      31-AUG-80
     5 Yash Shah                      24-NOV-85
     6 Dishank Parikh                 02-OCT-78
     7 Chandni Jain                   06-MAR-83
     8 Bhavesh Prajapati              13-MAY-71
     9 Priyank Khandelwal             18-JUN-86
    10 Mihir Vora                     11-NOV-95

customer_loan_taken table

LOAN_NO C_ID TAKEN_DAT LOAN_AMOUNT


  1011          1 12-SEP-11      100000
  1012          3 20-APR-10      200010
  1013          4 15-OCT-12      150000
  1014          5 04-JAN-13     2500005
  1015          7 15-AUG-16     2600001
  1016          8 21-DEC-16     3500000
  1017          9 13-NOV-17     4000000
  1018         10 05-MAR-18     1010100
;WITH cte AS (
    SELECT  CASE
                WHEN DATEDIFF ("YY", c_dob, GETDATE()) > 20 
                     AND DATEDIFF ("YY", c_dob, GETDATE()) <= 25 THEN '20-25'
                WHEN DATEDIFF ("YY", c_dob, GETDATE()) > 25 
                     AND DATEDIFF ("YY", c_dob, GETDATE()) <= 30 THEN '25-30'
                WHEN DATEDIFF ("YY", c_dob, GETDATE()) > 30 
                     AND DATEDIFF ("YY", c_dob, GETDATE()) <= 35 THEN '30-35'
                END AS rangedate,
                l.loan_amount
    FROM    customer
            INNER JOIN customer_loan_taken l ON customer.c_id = l.c_id
)

SELECT   rangedate, 
         AVG(loan_amount) average 
FROM     cte
GROUP BY rangedate

这适用于 Oracle 12c。计算年龄的技巧因数据库而异,因为 datediff 在 oracle 中不起作用。所以相应地修改它

      with customer( c_id, c_name, c_dob) as
      (select 1,'A','31/01/1990' from dual union
      select 2,'A','31/01/1980' from dual union
      select 3,'C','31/01/1970' from dual union
      select 4,'D','31/08/1990' from dual),
      ag as
      (select c.* , 
      FLOOR(TRUNC(MONTHS_BETWEEN(SYSDATE,  to_date(c_dob,'DD/MM/YYYY'))) /12) as age,
      case when FLOOR(TRUNC(MONTHS_BETWEEN(SYSDATE,  to_date(c_dob,'DD/MM/YYYY'))) /12) between 20 and 25 then '20-25' when
      FLOOR(TRUNC(MONTHS_BETWEEN(SYSDATE,  to_date(c_dob,'DD/MM/YYYY'))) /12) between 30 and 35 then '30-35' when
      FLOOR(TRUNC(MONTHS_BETWEEN(SYSDATE,  to_date(c_dob,'DD/MM/YYYY'))) /12) between 40 and 45 then '40-45'
      end as agegroup from customer c
      ),
      customer_loan_taken( loan_no, c_id, taken_date, loan_amount) 
      as
      (
      select 101,1,'01/01/1990',1000 from dual union
      select 102,2,'01/01/1990',2000 from dual union
      select 103,3,'01/01/1990',3000 from dual union
      select 104,4,'01/01/1990',4000 from dual 
      )
      select distinct(ag.agegroup),avg(loan_amount) from customer_loan_taken cl,ag
      where ag.c_id=cl.c_id
      group by ag.agegroup
select avg(loan_amt) "LOAN_AVG",age_range from(
  select l.loan_amount as loan_amt,
  (case
  when FLOOR((months_between(sysdate,to_CHAR(c.c_dob,'DD-MON-YYYY')))/12) 
  between 20 and 25 then '20-25'
  when FLOOR((months_between(sysdate,to_CHAR(c.c_dob,'DD-MON-YYYY')))/12) 
  between 30 and 35 then '30-35'
  when FLOOR((months_between(sysdate,to_CHAR(c.c_dob,'DD-MON-YYYY')))/12) 
  between 40 and 45 then '40-45'
  else '46-90'
  end) as age_range
from customer c,cust_loan_taken l
 where c.C_ID=l.C_ID) a
 group by age_range;