我有两个表格(timesheet和tasks),每个表格都包含一个“分配时间”和“实际时间”的小时值列,我想获取这些值的总和。另外,timesheet表格包含一个整数值“staff_id”,对应于任务表格中的“assigned_to”。
任务表格包含:
时间表格包含以下内容:
上面是我想得到的内容,但所有结果都正确,但约翰·史密斯分配的时间翻了一倍。我知道这与“分组陷阱”有关,如此描述:http://wikido.isoftdata.com/index.php/The_GROUPing_pitfall,但我试图理解它时总是眼花缭乱。有人能指点我吗?(再次编辑)如果我只对任务表运行查询:
它(正确地)导致:
您可以看到用户ID为“4”的John Smith已经翻了一倍(还有ID 6)。
仅在时间表上运行查询:
运行JoachimL提供的查询会产生以下结果:
这里有一个演示代码,链接地址为http://sqlfiddle.com/#!2/ef680。
任务表格包含:
task_id INT(11)
assigned_to INT(11)
date_start DATE
hrs DECIMAL (10,0)
时间表格包含以下内容:
timesheet_id (int)
name varchar(100)
hours decimal(10,0)
staff_id(INT 11)
我的查询看起来像这样:
SELECT
timesheet.staff_id,
task.assigned_to,
SUM(task.hrs) AS assigned_hrs,
timesheet.name,
SUM(timesheet.hours) AS actual_hours
FROM timesheet
INNER JOIN task
ON timesheet.staff_id = task.assigned_to
GROUP BY timesheet.name
这将(错误地)导致以下结果:
staff_id |assigned_to |assigned_hrs | name. | actual_hours |
---------------|------------|----------------|---------------|---------------|
4 |4 | 1364 | John Smith |52
2 |2 | 80 | Jane Doe |14.5
6 |6 | 454 | Test User 1 |40
9 |9 | 262 | Test User 2 |4
上面是我想得到的内容,但所有结果都正确,但约翰·史密斯分配的时间翻了一倍。我知道这与“分组陷阱”有关,如此描述:http://wikido.isoftdata.com/index.php/The_GROUPing_pitfall,但我试图理解它时总是眼花缭乱。有人能指点我吗?(再次编辑)如果我只对任务表运行查询:
SELECT
task.assigned_to,
SUM(task.hrs) AS allocated_hrs
FROM task
GROUP BY task.assigned_to
它(正确地)导致:
assigned_to | allocated_hrs |
----------------------------
4 | 682
7 | 378
2 | 40
6 | 227
9 | 262
您可以看到用户ID为“4”的John Smith已经翻了一倍(还有ID 6)。
仅在时间表上运行查询:
SELECT
timesheet.name,
SUM(timesheet.hours) AS actual_hours
FROM timesheet
GROUP BY timesheet.name
正确的结果是:
name | Actual_hrs
-------------------------
Jane Doe | 19.5
John Smith | 6.5
Test User1 | 4
Test User2 | 5
运行JoachimL提供的查询会产生以下结果:
staff_id | assigned_to | assigned_hrs | name | actual_hours
----------------------------------------------------------------------
2 2 40 Jane Doe 19.5
4 4 24 John Smith 6.5
4 4 7 John Smith 6.5
4 4 21 John Smith 6.5
4 4 210 John Smith 6.5
4 4 28 John Smith 6.5
4 4 91 John Smith 6.5
6 6 14 Test User 1 8
6 6 91 Test User 1 8
6 6 28 Test User 1 8
6 6 3 Test User 1 8
9 9 24 Test User 2 1
9 9 91 Test User 2 1
9 9 56 Test User 2 1
这里有一个演示代码,链接地址为http://sqlfiddle.com/#!2/ef680。