【问题标题】:Get the sum for unique fields获取唯一字段的总和
【发布时间】:2013-10-02 13:50:35
【问题描述】:

假设我想获取 ID、价格和 SUM(price),它应该如下所示:

ID    price    sum
--------------------
 1     10      
 1     10      20
 2     20      
 2     20      40
 3     30
 3     30      60

实现这一目标的方法是什么?我的真实查询:

SELECT users.login, projects.name, time_entries.issue_id, time_entries.hours
FROM users, time_entries
INNER JOIN projects ON time_entries.project_id = projects.id
WHERE time_entries.spent_on = CURDATE() - 1
AND time_entries.user_id = users.id
ORDER BY users.login;

表演

+-------+----------------------------------------------------+----------+-------+
| login | name                                               | issue_id | hours |
+-------+----------------------------------------------------+----------+-------+
| ach   | name1                                              |    12624 |     8 |
| aco   | name2                                              |    11550 |     3 |
| aco   | name2                                              |    11585 |     3 |
| alt   | name3                                              |    12644 |   7.5 |
| ata   | name4                                              |    12761 |     1 |
| ata   | name5                                              |     NULL |     1 |
| ata   | name6                                              |    12790 |   0.5 |
| ata   | name7                                              |    12677 |   5.5 |
| ato   | name8                                              |    12530 |     8 |
| elb   | name8                                              |    12697 |     1 |
| elb   | Software management                                |    12678 |     7 |

我想在第五列中获取唯一登录的小时数。

【问题讨论】:

  • 您显示的数据与您需要的数据不匹配(即没有“价格”列)。此外,您的输出是否需要总和为空的行?或者,“它应该是什么样子”是笼统的,而不是针对您的确切数据?

标签: mysql select sum


【解决方案1】:

我相信你在这里寻找的是GROUP BY

SELECT
    users.login, SUM(time_entries.hours) AS hours
FROM
    users
    JOIN time_entries ON time_entries.user_id = users.id
WHERE
    time_entries.spent_on = CURDATE() - 1
GROUP BY
    users.login

这将产生类似于:

login    hours
--------------
 ach     42
 alt     13
 ata     27

如果您想包含issue_id 列,根据您的示例输出,它们可能会有所不同,您可能对GROUP_CONCAT() 感兴趣,它将获取给定用户遇到的每个问题的逗号分隔列表:

SELECT
    users.login,
    GROUP_CONCAT(issue_id) AS issues,
    SUM(time_entries.hours) AS hours
...

【讨论】:

    【解决方案2】:
    SELECT users.login, projects.name, time_entries.issue_id, SUM(time_entries.hours) as hours
    FROM users, time_entries
    INNER JOIN projects ON time_entries.project_id = projects.id
    WHERE time_entries.spent_on = CURDATE() - 1
    AND time_entries.user_id = users.id GROUP BY users.login
    ORDER BY users.login;
    

    【讨论】:

      【解决方案3】:

      newfurniturey,感谢您的回答,也感谢其他人。 那是我正在寻找的最近的:

      SELECT users.login, GROUP_CONCAT(projects.name),
      GROUP_CONCAT(time_entries.issue_id),
      GROUP_CONCAT(time_entries.hours), SUM(time_entries.hours) as hours 
      FROM users, time_entries 
      INNER JOIN projects ON time_entries.project_id = projects.id
      WHERE time_entries.spent_on = CURDATE() - 1 
      AND time_entries.user_id = users.id
      GROUP BY users.login ORDER BY users.login;
      
          | ata   | name1,name2,name3 | 12761,12790,12677 | 1,1,0.5,5.5 | 8 |
      

      但如果可能的话,我想得到下一个结果:

      | ata   | name1 | 12761 | 1   |   |
      | ata   | name2 | 12790 | 1   |   |
      | ata   | name3 | 12677 | 0.5 |   |
      | ata   | name3 | 12677 | 5.5 | 8 |
      

      | ata   | name1 | 12761 | 1   |
      | ata   | name2 | 12790 | 1   |
      | ata   | name3 | 12677 | 0.5 |
      | ata   | name3 | 12677 | 5.5 |
      | ata   |       |       |     | 8 |
      

      【讨论】:

        猜你喜欢
        • 2015-03-01
        • 2011-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多