我有兩個表(時間表和任務)每個包含一個小時值列「分配小時數」和「實際小時數」,其中我試圖得到這兩個值的總和。 也時間表表包含「staff_id」一個整數值,其對應於在任務表中的「assigned_to」mysql group通過返回不正確的結果
任務表包含:
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「,這是約翰史密斯已經加倍(也是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
請編輯您的查詢,包括產生不正確的結果的數據。 –
你怎麼樣GROUP BY timesheet.staff_id?也許有兩個約翰史密斯的? –
考慮提供適當的DDL(和/或sqlfiddle)與期望的結果集 – Strawberry