2017-12-21 9 views
0

以下のクレームデータがあります。私は特定の年齢層、性別、健康状態に基づいてクレームの数を見つける必要があります。私は結果テーブルに年齢グループごとにTotalClaimsを追加する方法があるかどうかを判断しようとしています。今、私は Sum(d.totalclaims)を以下のクエリに追加しました。条件と性別に基づいてフィルタリングされ、年齢グループではないため、間違っています。 3つの条件(年齢、条件、性別)に基づいてクレームを取得する方法。任意のアイデア/提案、してください!3列に基づいてデータをフィルタリングするSQL集計関数

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  | 
+----+---------+ 
+0

ここで期待される結果は何ですか?また、サンプルデータをDDLで**消耗品**形式で掲載できますか?ありがとう。 – Larnu

答えて

0

テーブルが欠落している年齢層を。 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選択が必要なのかわかりませんが、私はそれをそのままにしています。

1

私は、それぞれの列を持つのではなく、年齢を1つの列にグループ化したいと考えています。

このようなことで、必要なものが得られますか?

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 
1

これは、あなたが探しているクエリです:

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 
関連する問題