sql - ALTERNATE TO SQL GROUPBY(例如避免在聚合字段上重复)

标签 sql group-by

是否有任何方法可以让查询返回 8 个字段,但仅按一个字段进行分组,并在另一字段上仅执行一个聚合函数? 我收到一个错误,表明我需要按所有没有聚合函数的字段进行分组。

我需要查找每个月已完成的调查数量,但需要包含其他信息,例如 session 开始时间、 session 状态、 session ID 等。

当我尝试执行此操作时:

SELECT Datepart("m", starttime), 
       COUNT(sessionid), 
       sessionstatus, 
       starttime, 
       endtime, 
       surveyid, 
       surveybook, 
       userdesk 
FROM   survey_sessions 
GROUP  BY Datepart("m", starttime) 

我收到错误: “您试图执行一个不包含指定表达式“SessionStatus”作为聚合函数一部分的查询”

我不需要任何其他聚合,并且按剩余字段分组并不能让我获得每月总计。

最佳答案

如果您使用 GROUP BY,则无论如何都必须将所有选定的字段包含在 GROUP BY 中。

如果您将所有内容都包含在 group by 子句中,您可能不会获得预期的结果,因为我假设在对这么多列进行分组时,每一行几乎都是唯一的。

假设您正在使用 SQL Server 可以尝试:

SELECT Datepart("m", starttime), 
   COUNT(sessionid) OVER(PARTITION BY Datepart("m", starttime)) AS Count, 
   sessionstatus, 
   starttime, 
   endtime, 
   surveyid, 
   surveybook, 
   userdesk 
FROM   survey_sessions 

这将显示您正在查找的所有信息,并在每行上显示当月发生的信息数。

我不能 100% 确定您要实现的目标,因此很难更具体。

编辑:添加替代访问解决方案。

如果您也需要它在访问中工作,您可以尝试以下操作。将 '' 替换为与第一个查询返回的数据类型对应的数字、日期或字符串。这会将行放在查询的底部,其中包含每月的总计。

SELECT Datepart("m", starttime), 
   0 AS COUNT
   sessionstatus, 
   starttime, 
   endtime, 
   surveyid, 
   surveybook, 
   userdesk 
FROM   survey_sessions 

UNION ALL 

SELECT Datepart("m", starttime),
   COUNT(sessionid) as Count,
   '',
   '',
   '',
   '',
   '',
   ''
FROM survey_sessions
GROUP BY Datepart("m", starttime)

关于sql - ALTERNATE TO SQL GROUPBY(例如避免在聚合字段上重复),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9525303/

相关文章:

javascript - 在处理潜在的未定义值时创建 SQL SELECT 查询的最佳实践

php - 第二个准备好的声明没有触发

mysql - 查找表中的类别数

python - 按 Pandas 数据框和条件分组

python - 根据年份和月份列创建包含该月第 7 个工作日的新列

r - 在 R 上按列值聚合行(总和)的最简单方法是以下类型的数据框?

mysql - 差距检测 - 识别跳过/错过的日期

java - 检查和删除数据库中的 2 个值时 Hibernate JPA 出错

sql - 在复杂的 mysql 分页查询逻辑方面需要帮助

scala - Spark 斯卡拉: User defined aggregate function that calculates median