sql - MySQL 添加总计列

标签 sql mysql aggregate-functions subquery

我需要查询此数据库以获取每一行,以及结果的其中一个列值的 SUM。我可以使用 php 来获取总值,但是我需要运行两个循环,一个循环来获取总值(位于结果上方的顶部)。所以我更喜欢查询来捕获它并只生成一个“总计”行,但我让它工作的唯一方法是使用一个子查询,该子查询本质上是原始查询的重复。有没有更好的办法?

SELECT 
CONCAT(u.firstname, ' ', u.lastname ) name, u.id, s.description, s.shiftstart, s.shiftend, 
    (SELECT 
    SUM( TIME_TO_SEC( TIMEDIFF( shiftend, shiftstart ) ) ) /3600
    FROM shifts
    WHERE id =  '$user'
    AND DATE( shiftstart )
    BETWEEN '$start'
    AND '$end') total
FROM shifts s
INNER JOIN users u ON ( s.id = u.id )
WHERE s.id = '$user'
AND DATE( shiftstart )
BETWEEN '$start'
AND '$end'
ORDER BY shiftstart

以上工作及输出:

name        id     description  shiftstart             shiftend               total
Joe User    joeuser    Stuff    2009-01-05 07:45:00    2009-01-05 12:15:00    39.5000
Joe User    joeuser    Stuff    2009-01-05 13:00:00    2009-01-05 17:00:00    39.5000
Joe User    joeuser    Stuff    2009-01-06 07:45:00    2009-01-06 10:45:00    39.5000
Joe User    joeuser    Stuff    2009-01-06 10:45:00    2009-01-06 12:45:00    39.5000
Joe User    joeuser    Stuff    2009-01-06 13:30:00    2009-01-06 14:30:00    39.5000
Joe User    joeuser    Stuff    2009-01-06 14:30:00    2009-01-06 17:00:00    39.5000
Joe User    joeuser    Stuff    2009-01-07 09:45:00    2009-01-07 14:00:00    39.5000
Joe User    joeuser    Stuff    2009-01-07 15:00:00    2009-01-07 17:00:00    39.5000
Joe User    joeuser    Stuff    2009-01-08 08:00:00    2009-01-08 12:15:00    39.5000
Joe User    joeuser    Stuff    2009-01-08 13:15:00    2009-01-08 17:00:00    39.5000
Joe User    joeuser    Stuff    2009-01-09 07:45:00    2009-01-09 10:45:00    39.5000
Joe User    joeuser    Stuff    2009-01-09 11:45:00    2009-01-09 15:15:00    39.5000
Joe User    joeuser    Stuff    2009-01-09 15:15:00    2009-01-09 17:00:00    39.5000

这是我需要的,但可能不是获得它的最佳方式。

最佳答案

MySQL 支持一种特殊的分组依据修饰符,称为 ROLLUP .

SELECT CONCAT(u.firstname, ' ', u.lastname ) name, u.id, 
  s.description, s.shiftstart, s.shiftend, 
  SUM( TIME_TO_SEC( TIMEDIFF( shiftend, shiftstart ) ) ) /3600 total
FROM shifts s INNER JOIN users u ON ( s.id = u.id )
WHERE s.id = ? AND DATE( shiftstart ) BETWEEN ? AND ?
GROUP BY u.id, s.shiftstart WITH ROLLUP
ORDER BY shiftstart;

关于sql - MySQL 添加总计列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/489904/

相关文章:

mysql - SQL 仅选择列上具有最大值的行

mysql - 以日历季度为列分组

sql - COMMIT会做什么?

c# - 通过 nHibernate Criterion 使用 SQL CONVERT 函数

c# - 将 SQL 转换为 linq to sql - 按两列分组并请求第三列的计数

php - 用于获取最佳答案的自定义 mysql 查询

mysql - SQL 查询 : Sum(@variable)

sql - SQL Server 2008密码以分号结尾

MySQL按字母和数字列排序

mysql - 行总和