簡體   English   中英

SQL Aggregate函數基於3列過濾數據

[英]SQL Aggregate function to filter data based on 3 columns

我有以下索賠數據。 我需要根據特定年齡段,性別和健康狀況找到索賠的數量。 我試圖找出是否有一種方法可以在結果表中按年齡段添加TotalClaims。 現在,我在以下查詢中添加了Sum(d.totalclaims) ,這是錯誤的,因為它是根據條件和性別而不是年齡組進行過濾的。 如何基於所有三個條件(年齡,條件,性別)獲得索賠。 任何想法/建議,請!

SELECT c.condition, 
       a.gender, 
       Sum(CASE WHEN a.age BETWEEN 40 AND 50 THEN 1 END) AS Members_40_50_years, 
       Sum(d.totalclaims) 
FROM   (SELECT DISTINCT id, gender, age FROM   agetable) AS a 
       INNER JOIN (SELECT DISTINCT id, condition 
                   FROM   conditiontable) AS c 
               ON a.id = c.id 
       INNER JOIN (SELECT Count(DISTINCT claimid) AS TotalClaims, id 
                   FROM   claimstable group by id) d 
               ON d.id = a.id 
GROUP  BY gender, 
          condition 

年齡表

+----+--------+-----+
| ID | Gender | Age |
+----+--------+-----+
|  1 | M      |  45 |
|  2 | F      |  60 |
+----+--------+-----+

條件表

+----+--------------+
| ID |  Condition   |
+----+--------------+
|  1 | HeartFailure |
|  1 | Diabetes     |
|  2 | Diabetes     |
+----+--------------+

索償表

+----+---------+
| ID | ClaimID |
+----+---------+
|  1 | A11     |
|  1 | 345     |
|  1 | A32     |
|  2 | 542     |
|  2 | 675     |
+----+---------+

我希望將年齡分組到一列,而不是每列都有一列。

這樣的事情能給您您所需要的嗎?

SELECT
    A.Gender
    ,
        CASE
            WHEN A.Age BETWEEN 30 AND 40 THEN '30-40'
            WHEN A.Age BETWEEN 40 AND 50 THEN '40-50'
            --etc.
        END AgeGroup
    , CD.Condition
    , COUNT(*) TotalClaims
FROM
    agetable A
    JOIN conditiontable CD ON A.ID = CD.ID
    JOIN claimstable CL ON A.ID = CL.ID
GROUP BY
    A.Gender
    ,
        CASE
            WHEN A.Age BETWEEN 30 AND 40 THEN '30-40'
            WHEN A.Age BETWEEN 40 AND 50 THEN '40-50'
            --etc.
        END
    , CD.Condition

這是您要查找的查詢:

drop table if exists #age, #condition, #claims 

create table #age
(
id      int,
gender  char(1),
Age     int
);

insert  into 
#age    values (1,'M',45), (2,'F',60)

create table #Conditon
(
Id          int,    
Condition   nvarchar(30)
);

insert      into 
#Conditon   values (1, 'HeartFailure'), (1,'Diabetes'), (2, 'Diabetes')

create table #claims    
(
Id      int,
ClaimId nvarchar(4)
)

insert  into 
#claims values (1, 'A11'), (1, '345'), (1, 'A32'), (2, '542'), (2, '675')



SELECT  a.gender
        , a.Age
        , con.Condition
        , count(distinct cl.ClaimId) as ClaimCnt
FROM    #claims cl
JOIN    #Conditon con
        on cl.Id = con.Id
join    #age a
        on a.id = cl.Id
group 
by      a.gender
        , a.Age
        , con.Condition

年齡組表丟失。 使用Chris Mack的設置

create table #age
(
id      int,
gender  char(1),
Age     int
);

insert  into 
#age    values (1,'M',45), (2,'F',60)

create table #Condition
(
Id          int,    
Condition   nvarchar(30)
);

insert      into 
#Condition   values (1, 'HeartFailure'), (1,'Diabetes'), (2, 'Diabetes');

create table #claims    
(
Id      int,
ClaimId nvarchar(4)
);


insert  into 
#claims values (1, 'A11'), (1, '345'), (1, 'A32'), (2, '542'), (2, '675');

-- table of ranges
create table #agerange    
(
rfrom   int,
rto int
);
insert  into 
#agerange values (0,39),(40,50),(51,70);

SELECT c.condition, 
       a.gender, 
       cast(r.rfrom as varchar(3))+'_'+cast(r.rto as varchar(3)) range,
       Sum(d.totalclaims) 
FROM   (SELECT DISTINCT id, gender, age FROM  #age) AS a 
       INNER JOIN #agerange r ON a.age BETWEEN r.rfrom and r.rto
       INNER JOIN (SELECT DISTINCT id, condition 
                   FROM   #condition) AS c 
               ON a.id = c.id 
       INNER JOIN (SELECT Count(DISTINCT claimid) AS TotalClaims, id 
                   FROM   #claims group by id) d 
               ON d.id = a.id 
GROUP  BY gender, 
          condition,
          cast(r.rfrom as varchar(3))+'_'+cast(r.rto as varchar(3));

我不明白您為什么需要這些DISTINCT選擇,但我保持原樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM