[英]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.