【问题标题】:SQL fetch records using group by with 3 conditionsSQL 使用 group by 3 个条件获取记录
【发布时间】:2018-03-29 07:17:21
【问题描述】:

我正在尝试编写一个查询,根据年龄、性别和状况(糖尿病、高血压等)为我提供患者就诊次数。获取糖尿病患者的就诊次数,按性别分组,以及年龄在 45-54 岁之间的患者。我使用 Inner Join 仅获取两个表中都存在的行。我得到了错误:

age.Age 在选择列表中无效,因为它不包含在 聚合函数或 GROUP BY 子句。

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

TABLE_A

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

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

【问题讨论】:

  • 向我们展示数据库架构、示例数据、当前和预期输出。请阅读How-to-Ask
  • 您知道您的年龄计算不准确吗?如果该人今年的生日已经过,则此方法有效。
  • 高血压也有 2 次就诊吗?
  • visitflag 不存在,你的意思是VisitCount
  • @SeanLange 是对的。搜索此站点结果后,年龄计算并不那么简单。但这里有一个answer 有非常详细的解决方案。

标签: sql sql-server join group-by inner-join


【解决方案1】:

您可以简化查询,在WHERE 条件下过滤年龄

正如 Sean 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]

编辑

必须更改WHERE 条件以解决年龄精度并允许使用索引。

【讨论】:

    猜你喜欢
    • 2016-05-15
    • 2018-07-03
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2020-12-19
    相关资源
    最近更新 更多