【问题标题】:Sum of column breaking in group by of three-table join三表连接的group by中的列中断总和
【发布时间】:2019-11-17 19:41:29
【问题描述】:

我在使用三表连接时遇到问题,当我从 group by 子句的第三个表中添加字段时,字段的总和会被破坏:

-- First join returns 100 rows which are all the Employee's in table

SELECT Employee.First_Name,
       Employee.Last_Name,
       Employee.Emp_ID,
       SUM(WorkSchedule.Hours_Worked) Hours_Worked
FROM   Employee
INNER JOIN WorkSchedule
ON Employee.Emp_ID = WorkSchedule.Emp_ID
GROUP BY 
       Employee.First_Name,
       Employee.Last_Name,
       Employee.Emp_ID

输出:

First_Name  Last_Name   Emp_ID  Hours_Worked
Laura       Dorrity     1       63.00
Aube        Habershaw   2       70.97
Tessy       Goding      3       61.52
Ana         Kilroy      4       29.01
Ardella     Sprowson    5       48.12

但是第二个连接打破了总和:

-- Should also return 100 rows - returns 646

SELECT Store.Store_Name,
       Employee.First_Name,
       Employee.Last_Name,
       Employee.Emp_ID,
       SUM(WorkSchedule.Hours_Worked) Hours_Worked
FROM   Employee
INNER JOIN WorkSchedule
ON Employee.Emp_ID = WorkSchedule.Emp_ID
INNER JOIN Store
ON WorkSchedule.Store_ID = Store.Store_ID
GROUP BY 
       Employee.First_Name,
       Employee.Last_Name,
       Employee.Emp_ID,
       Store.Store_Name

输出:

Store_Name      First_Name      Last_Name   Emp_ID  Hours_Worked
Mycat           Christa         Bruno       77      9.54
Jabbercube      Elisha          Siley       54      2.50
Riffwire        Evanne          Whifen      62      8.95
Thoughtworks    Laura           Dorrity     1       2.86

这显然不是我们想要的输出。我试过改变连接的类型,但没有效果。表格:

员工表

商店表

工作安排表

感谢您的帮助。

K

更新:

-- Employee

Emp_ID  First_Name  MI      Last_Name   Address1            Address2    City        State_CD    Zip_code    Zip_Ext Email                       Phone       Hourly_Salary   Active_IND  CREATE_BY   CREATE_DT           UPDATE_BY   UPDATE_DT
1       Laura       NULL    Dorrity     9263 Towne Street   NULL        Jackson     TN          38308       NULL    ldorrity0@trellian.com      NULL        15.75       1           User        2019-11-06 19:49:59.750 User        2019-11-06 19:49:59.750
2       Aube        M       Habershaw   70 Jenna Avenue     NULL        Miami       FL          33185       NULL    NULL                        13059196714 15.75       1           User        2019-11-06 19:49:59.750 User        2019-11-06 19:49:59.750
3       Tessy       F       Goding      7 Maywood Center    NULL        Portsmouth  NH          03804       NULL    tgoding2@1und1.de           16039019562 15.75       1           User        2019-11-06 19:49:59.750 User        2019-11-06 19:49:59.750
4       Ana         NULL    Kilroy      2003 Sachs Crossing NULL        Louisville  KY          40298       NULL    akilroy3@thetimes.co.uk     NULL        15.75       1           User        2019-11-06 19:49:59.750 User        2019-11-06 19:49:59.750
5       Ardella     F       Sprowson    40290 Kipling Alley NULL        Raleigh     NC          27658       NULL    NULL                        NULL        15.75       1           User        2019-11-06 19:49:59.750 User        2019-11-06 19:49:59.750


-- Store

Store_ID    Store_Name      Manager_ID      Address1                Address2    City                State_CD    Zip_code    Zip_Ext Email                               Phone       Active_IND  CREATE_BY   CREATE_DT               UPDATE_BY   UPDATE_DT
1           Riffwire        47              73768 Forest Run Plaza  NULL        New York City       NY          10280       NULL    shedges0@pagespersoorange.fr        13474826752 1           User        2019-11-06 19:49:59.757 User        2019-11-06 19:49:59.757
2           Thoughtworks    94              4 Scofield Trail        NULL        Van Nuys            CA          91406       NULL    alarge5@plala.or.jp                 16265775586 1           User        2019-11-06 19:49:59.757 User        2019-11-06 19:49:59.757
3           Thoughtstorm    24              40642 Schlimgen Lane    NULL        Indianapolis        IN          46254       NULL    kcanarioc@cargocollective.com       13175466135 1           User        2019-11-06 19:49:59.757 User        2019-11-06 19:49:59.757
4           Jabbersphere    91              7330 Pepper Wood Circle NULL        Lakeland            FL          33805       NULL    msilversmidtj@constantcontact.com   18631093285 1           User        2019-11-06 19:49:59.757 User        2019-11-06 19:49:59.757
5           Brainlounge     100             2 Ludington Pass        NULL        Saint Petersburg    FL          33715       NULL    fmynottw@acquirethisname.com        17273590553 1           User        2019-11-06 19:49:59.757 User        2019-11-06 19:49:59.757


-- WorkSchedule

WSID    Emp_ID  Store_ID    ShiftDate           Hours_Worked    CheckDate   Active_IND  CREATE_BY   CREATE_DT   UPDATE_BY   UPDATE_DT
1       37      3           2019-11-13 00:00:00.000 6.81        NULL        NULL        NULL        NULL        NULL        NULL
2       64      5           2019-11-14 00:00:00.000 7.29        NULL        NULL        NULL        NULL        NULL        NULL
3       23      6           2019-11-14 00:00:00.000 2.09        NULL        NULL        NULL        NULL        NULL        NULL
4       45      7           2019-11-13 00:00:00.000 4.20        NULL        NULL        NULL        NULL        NULL        NULL
5       68      5           2019-11-10 00:00:00.000 4.99        NULL        NULL        NULL        NULL        NULL        NULL
6       8       4           2019-11-11 00:00:00.000 7.14        NULL        NULL        NULL        NULL        NULL        NULL
7       37      6           2019-11-12 00:00:00.000 6.83        NULL        NULL        NULL        NULL        NULL        NULL

更新答案:

感谢 LukStorms 的故障排除和回答 - 他对检查所有 Store_ID 是否都存在的判断是正确的:

select count(Store_ID) from WorkSchedule; -- no nulls

...如果员工可能在不止一家商店工作:

select Emp_ID,Store_ID from WorkSchedule order by Emp_ID; -- one to many

更正后的查询:

SELECT STRING_AGG(Store.Store_Name, ', ') WITHIN GROUP (ORDER BY Store.Store_Name) AS StoreNames,-- Store.Store_Name,
       Employee.First_Name,
       Employee.Last_Name,
       Employee.Emp_ID,
       SUM(WorkSchedule.Hours_Worked) Hours_Worked
FROM   Employee
INNER JOIN WorkSchedule
ON Employee.Emp_ID = WorkSchedule.Emp_ID
LEFT JOIN Store
ON WorkSchedule.Store_ID = Store.Store_ID
GROUP BY 
       Employee.First_Name,
       Employee.Last_Name,
       Employee.Emp_ID

谢谢,很高兴看到人们仍然会帮助新手...

【问题讨论】:

  • 也许您正在寻找LEFT JOIN?也许您正在寻找 LEFT JOIN 并预先聚合 valies。没有样本数据是不可能知道的。
  • @Larnu 刚看到你的回复,我会更新我的帖子。

标签: sql-server join group-by


【解决方案1】:

加入那个额外的表可能有 2 个问题。

1) 可能有没有填写store_id的工作计划。

2) 每位员工的工作时间表不一定都针对同一家商店。

要解决第一个问题,请在 Store 表上使用 LEFT JOIN 而不是当前的 INNER JOIN。

要解决第二个问题,请将 GROUP BY 仅保留在 Employee 字段中。

GROUP BY Employee.Emp_ID, Employee.First_Name, Employee.Last_Name

然后聚合为 Store_Name。
例如(如果您的版本支持)STRING_AGG 函数。

STRING_AGG(Store.Store_Name, ', ') WITHIN GROUP (ORDER BY Store.Store_Name) AS StoreNames

【讨论】:

  • 我统计了Store_ID,它们都在那里,应该解决问题一,至于问题二,您能进一步解释一下吗?我将谷歌并尝试 STRING_AGG() 函数。祝我好运!
  • 这些字符串是每个员工工作的 Store_Names 吗?如果是这样,你就是个天才!!谢谢。
  • @kn0t 很高兴它对您有所帮助。 :) 而且您很幸运,您使用的是最新版本的 MS Sql Server。如果没有 STRING_AGG,这样的查询会更复杂。例如this old example.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 2018-02-12
  • 2014-02-22
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多