2017-10-17 64 views
1

我想编写一个查询这使我的年龄,性别和状况(糖尿病,高血压等)患者就诊的号取出使用组记录。根据性别和年龄在45-54岁之间的患者计算糖尿病患者和患者的访视次数。我使用Inner Join来仅获取两个表中存在的行。我得到的错误:SQL用3个条件

age.Age is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

你认为我应该使用age.age分区?

TABLE_A

+------------+------------+------------+ 
| Member_Key | VisitCount | date | 
+------------+------------+------------+ 
|  4000 |   1 | 2014-05-07 | 
|  4000 |   1 | 2014-05-09 | 
|  4001 |   2 | 2014-05-08 | 
+------------+------------+------------+ 

表-B

+------------+--------------+ 
| Member_Key | Condition | 
+------------+--------------+ 
|  4000 | Diabetes  | 
|  4000 | Diabetes  | 
|  4001 | Hypertension | 
+------------+--------------+ 

TABLE_C

+------------+---------------+------------+ 
| Member_Key | Member_Gender | Member_DOB | 
+------------+---------------+------------+ 
|  4000 | M    | 1970-05-21 | 
|  4001 | F    | 1968-02-19 | 
+------------+---------------+------------+ 

查询

SELECT c.conditions, 
     age.gender, 
     CASE 
      WHEN age.age BETWEEN 45 AND 54 
      THEN SUM(act.visitcount) 
     END AS age_45_54_years 
FROM table_a act 
    INNER JOIN 
(
    SELECT DISTINCT 
      member_key, 
      conditions 
    FROM table_b 
) c ON c.member_key = act.member_key 
    INNER JOIN 
(
    SELECT DISTINCT 
      member_key, 
      member_gender, 
      DATEPART(year, '2017-10-16')-DATEPART(year, member_dob) AS Age 
    FROM [table_c] 
) AS age ON age.member_key = c.member_key 
GROUP BY c.conditions, 
     age.member_gender; 

期望输出

+--------------+--------+-------------+ 
| Condition | Gender | TotalVisits | 
+--------------+--------+-------------+ 
| Diabetes  | M  |   2 | 
| Hypertension | F  |   2 | 
+--------------+--------+-------------+ 
+1

显示我们的DB模式,样本数据,当前和预期的输出。 \t请仔细阅读[**如何对向**](http://stackoverflow.com/help/how-to-ask) –

+1

你一定要明白,你的年龄计算不准确?如果这个人的生日已经在今年发生过,那么它就行得通 –

+1

高血压不是也有2次访问? –

回答

1

您可以简化您的查询过滤年龄对WHERE条件

而且肖恩Lange说,使用DATEDADDGETDATE()计算年龄更准确。

SQL DEMO

SELECT [Condition], 
     [Member_Gender] as [Gender], 
     SUM([VisitCount]) as [VisitCount] 
FROM TableA A 
JOIN (SELECT DISTINCT [Member_Key], [Condition] 
     FROM TableB) B 
    ON A.[Member_Key] = B.[Member_Key] 
JOIN TableC C 
    ON A.[Member_Key] = C.[Member_Key] 
WHERE [Member_DOB] BETWEEN DATEADD(year, -50 , GETDATE()) 
         AND DATEADD(year, -45 , GETDATE()) 
GROUP BY [Condition], [Member_Gender] 

编辑

Have to change the WHERE condition to solve the age precision and allow index use.