在 sql 查询中使用聚合函数时避免 group by 子句

Posted

技术标签:

【中文标题】在 sql 查询中使用聚合函数时避免 group by 子句【英文标题】:avoiding group by clause while using aggregate function in sql query 【发布时间】:2021-09-13 11:37:42 【问题描述】:

我在使用聚合函数的地方有这个 SQL 查询,但我不想使用 group by 子句,因为它会弄乱我的数据。这是我必须为一个聚合函数使用大量 group by 的第一个查询。

 select ti.task_name,cast(ti.start_date As VARCHAR),cast(th.created_date As VARCHAR),sum(th.previous_completed) as total,
ld.level_data,pi.project_code_1,pi.project_code_2
 from task_history th
left join task_information ti on ti.id =th.task_id
 left join project_information pi on ti.project_id = pi.id
 left join lookup_data ld on ti.activity=ld.id
where cast((th.created_date)as date) between '2021-06-28' and  '2021-06-29'  and ti.employee_id='092cdd13-5f30-4980-93d0-8246239728fd'
group by ti.employee_id,ti.task_name,ti.start_date,ld.level_data,th.created_date,pi.project_code_1,pi.project_code_2

我得到了这个结果:

 attend hotline calls        | 2021-06-28 | 2021-06-28 05:22:03.310768 |     0 | Sales monitoring
          |                |
 attend hotline calls        | 2021-06-28 | 2021-06-28 16:38:42.676874 |     3 | Sales monitoring

它应该汇总为 1 列。

这是我避免所有列名以避免重复结果的查询:

select ti.task_name,sum(th.previous_completed) as total
 from task_history th
left join task_information ti on ti.id =th.task_id
 left join project_information pi on ti.project_id = pi.id
 left join lookup_data ld on ti.activity=ld.id
where cast((th.created_date)as date) between '2021-06-28' and  '2021-06-29'  and ti.employee_id='092cdd13-5f30-4980-93d0-8246239728fd'
group by ti.task_name

我得到了这个结果:

 attend hotline calls        |     3

第一个结果显示一个额外的列,第二个结果符合预期,但我还想包含第一个结果的列。

我怎样才能做到这一点?

【问题讨论】:

你是什么意思“它会被数据搞砸”?请提供样本数据、期望的结果,并非常清楚地说明您正在尝试做什么。 更新了问题。对于一个聚合函数,我必须使用 group by 中的所有 coumn 名称 【参考方案1】:

您的主要问题是th.created_date 是您用作GROUP BY 列之一的时间戳。每条记录的时间不同,因此该列没有分组。

我不确定您为什么需要将日期转换为 Character Varying,但无论如何,如果您首先将日期转换为日期(例如 th.created_date::DATE)作为您选择的列和 GROUP BY。然后它会给你每个日期的总和(而不是每微秒)。

【讨论】:

【参考方案2】:

您可以使用窗口功能:

select ti.activity, ld.level_data, 
       sum(th.previous_completed) over (partition by ti.activity,ld.level_data) as total
from task_history th left join 
     task_information ti 
     on ti.id =th.task_id left join 
     lookup_data ld 
     on ti.activity=ld.id

【讨论】:

以上是关于在 sql 查询中使用聚合函数时避免 group by 子句的主要内容,如果未能解决你的问题,请参考以下文章

SQL中只要用到聚合函数就一定要用到group by 吗?

google bigquery SQL group by 聚合函数

使用函数 SUM() 和 Group by 将 Mysql 查询转换为 SQL 查询

mysql 从聚合函数group by到sql_mode

SQL group 分组查询

查询没有重复和聚合函数或 GROUP BY 子句问题。 - 重复