如何在一个查询中检索总和

Posted

技术标签:

【中文标题】如何在一个查询中检索总和【英文标题】:How to retrieve a sum of sums in one query 【发布时间】:2014-12-20 17:37:35 【问题描述】:

以下是对表格的简要说明:

所以每个人都有工作,每个工作都有打卡和打卡,另外,每个工作都有不同的工资率,我需要检索每个工作工资的SUM,基本上是小时数*工资,然后再次总结结果,因为每个小时的工资率不同。

这是我想出的,但它给了我 3 列,因为我按小时工资分组:

SELECT SUM(DATEDIFF(mi, dbo.tbl_Clock.clock_in, dbo.tbl_Clock.clock_out)) AS [Minutes]
      ,CAST(ROUND(SUM(DATEDIFF(mi, dbo.tbl_Clock.clock_in, dbo.tbl_Clock.clock_out)) 
           / 60.0 * dbo.tbl_Jobs.job_hourly_pay, 2) AS numeric(36, 2)) AS Total_P
      ,CAST(ROUND(AVG(DATEDIFF(mi, dbo.tbl_Clock.clock_in, dbo.tbl_Clock.clock_out)) 
          / 60.0 * dbo.tbl_Jobs.job_hourly_pay, 2) AS numeric(36, 2)) AS Avg_Pay

FROM dbo.tbl_Jobs 
INNER JOIN dbo.tbl_Clock  ON dbo.tbl_Jobs.user_id = dbo.tbl_Clock.user_id 
                         AND dbo.tbl_Jobs.job_id = dbo.tbl_Clock.job_id
WHERE (dbo.tbl_Jobs.user_id = 111) 
  AND (DATEPART(m, GETDATE()) = DATEPART(m, dbo.tbl_Clock.clock_in))
  AND (DATEPART(yyyy, GETDATE()) = DATEPART(yyyy, dbo.tbl_Clock.clock_in))
GROUP BY dbo.tbl_Jobs.job_hourly_pay

那么,如果没有分组并基本上得到总和,如何做到这一点呢?在我看来,通常我会采用不推荐的解决方案,将其拆分为此查询的视图和另一个查询来总结它们。

这是我得到的:

+--------+---------+---------+
| Minuts | Total_P | Avg_Pay |
+--------+---------+---------+
|     30 | 5.15    | 1.72    |
|    480 | 3601.60 | 3601.60 |
+--------+---------+---------+

这就是我想要的:

+--------+---------+---------+
| Minuts | Total_P | Avg_Pay |
+--------+---------+---------+
|    510 | 3606.75 | 3603.32 |
+--------+---------+---------+

【问题讨论】:

@GordonLinoff 我如何在这里以表格的形式发布数据?编辑:没关系。 如果您只是删除组依据会怎样? SQL 足够聪明,可以将正确的速率应用到正确的行。 @Jeremy 删除 group by 会导致一个不在 group by 子句中的错误。 【参考方案1】:

您不妨尝试以下方式:

select
sum(a.Minutes)
,sum(a.Total_P)
,sum(a.Avg_Pay)
from
(
SELECT SUM(DATEDIFF(mi, dbo.tbl_Clock.clock_in, dbo.tbl_Clock.clock_out)) AS [Minutes]
      ,CAST(ROUND(SUM(DATEDIFF(mi, dbo.tbl_Clock.clock_in, dbo.tbl_Clock.clock_out)) 
           / 60.0 * dbo.tbl_Jobs.job_hourly_pay, 2) AS numeric(36, 2)) AS Total_P
      ,CAST(ROUND(AVG(DATEDIFF(mi, dbo.tbl_Clock.clock_in, dbo.tbl_Clock.clock_out)) 
          / 60.0 * dbo.tbl_Jobs.job_hourly_pay, 2) AS numeric(36, 2)) AS Avg_Pay

FROM dbo.tbl_Jobs 
INNER JOIN dbo.tbl_Clock  ON dbo.tbl_Jobs.user_id = dbo.tbl_Clock.user_id 
                         AND dbo.tbl_Jobs.job_id = dbo.tbl_Clock.job_id
WHERE (dbo.tbl_Jobs.user_id = 111) 
  AND (DATEPART(m, GETDATE()) = DATEPART(m, dbo.tbl_Clock.clock_in))
  AND (DATEPART(yyyy, GETDATE()) = DATEPART(yyyy, dbo.tbl_Clock.clock_in))
GROUP BY dbo.tbl_Jobs.job_hourly_pay
)a

【讨论】:

非常感谢这非常聪明! 很高兴它对你有帮助!! :)

以上是关于如何在一个查询中检索总和的主要内容,如果未能解决你的问题,请参考以下文章

如何高效地使用 SQL 检索半小时间隔的数据?

如何在 MySQL 查询中找到最大总和的关联名称?

如何按年检索总和(金额)列?

如何编写从多个表中获取多行数量总和的查询?

MsSQL如何在一次查询中从给定的日期和仓库号获取最近的未来值和值的总和

如何通过c#在SQL中检索SUM函数的值