按SQL语句分组

时间:2010-02-28 00:16:46

标签: sql sql-server tsql group-by

所以我得到了这个声明,这很好用:

SELECT   MAX(patient_history_date_bio) AS med_date, medication_name
FROM     biological
WHERE    patient_id = 12)
GROUP BY medication_name

但是,我也希望得到相应的药物_dose。所以我输入了

SELECT   MAX(patient_history_date_bio) AS med_date, medication_name, medication_dose
FROM     biological
WHERE    (patient_id = 12)
GROUP BY medication_name

但是,它给我一个错误说:

  

“coumn'biimal.medication_dose'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。”

所以我尝试将GMB_dose添加到GROUP BY子句中,但是它给了我额外的行,我不想要。 我想在我的桌子上获得每种药物的最新行。 (最新行由max函数确定,获取最新日期。)

如何解决此问题?

3 个答案:

答案 0 :(得分:5)

使用:

SELECT b.medication_name,
       b.patient_history_date_bio AS med_date,
       b.medication_dose
  FROM BIOLOGICAL b
  JOIN (SELECT y.medication_name,
               MAX(y.patient_history_date_bio) AS max_date
          FROM BIOLOGICAL y
      GROUP BY y.medication_name) x ON x.medication_name = b.medication_name
                                   AND x.max_date = b.patient_history_date_bio
 WHERE b.patient_id = ?

答案 1 :(得分:1)

如果您真的需要,作为一种快速解决方法,您可以将汇总功能应用于medication_dose,例如MAX(medication_dose)

但请注意,这通常表示您要么错误地构建查询,要么需要重构/规范化数据库架构。在您的情况下,看起来您正在错误地处理查询。 OMG Poinies in another answer建议采用正确的方法。

您可能有兴趣查看以下有趣的文章,该文章描述了此错误背后的原因:

答案 2 :(得分:0)

您需要将max(medication_dose)放入您的选择中。 Group by返回一个结果集,其中包含group by子句中字段的不同值,因此显然您有多个记录具有相同的medication_name但不同的剂量,因此您得到两个结果。

通过输入max(medication_dose),它将返回每个medication_name的最大剂量值。您可以在剂量(最大值,最小值,平均值,总和等)上使用任何聚合函数