我正在运行一个学校奖励系统,其中员工为学生分配积极的态度和行为。
我有两张桌子:
员工
ID
,Firstname
,Surname
,Position
,Faculty
,Subject
,Hours
,Allocation
交易
Transaction_ID
,Datetime
,Giver_ID
,Recipient_ID
,Points
,Category_ID
,Reason
我正在尝试编写一条SQL语句,显示员工每周分配的点数。
这句话......
SELECT
CONCAT(s.Firstname, " ", s.Surname) AS `Staff Name`,
SUM(t.Points) AS `Points Allocated`
FROM transactions t
LEFT JOIN staff s ON t.Giver_ID = s.ID
WHERE `Datetime` >= '2012-10-08'
GROUP BY t.Giver_ID
ORDER BY `Points Allocated` ASC
...显示已分配当周点数的用户列表以及数量。
然而,它不会显示已分配0分的用户。
有没有办法修改我的陈述以包含这些用户?可能是使用staff
表并加入transactions
反向编写联接?不幸的是,我不知道从哪里开始。
提前致谢,
答案 0 :(得分:1)
是的,你必须逆转,
SELECT
CONCAT(s.Firstname, " ", s.Surname) AS `Staff Name`,
COALESCE(SUM(t.Points), 0) AS `Points Allocated`
FROM staff s
LEFT JOIN transactions t ON t.Giver_ID = s.ID
WHERE t.Datetime >= '2012-10-08' or t.Datetime IS NULL
GROUP BY s.ID
ORDER BY `Points Allocated` ASC
修改强>
根据Ianzz的建议,应该更快SELECT
CONCAT(s.Firstname, " ", s.Surname) AS `Staff Name`,
COALESCE(SUM(t.Points), 0) AS `Points Allocated`
FROM staff s
LEFT JOIN transactions t ON t.Giver_ID = s.ID and t.Datetime >='2012-10-08'
GROUP BY s.ID
ORDER BY `Points Allocated` ASC
或在s.ID上使用RIGHT JOIN和group(在这两种情况下,如果您不想要空值,则必须使用SUM上的合并(t.Points),您还必须检查“NULL transaction datetime”,或者使用联接中的日期谓词
你会看到更多LEFT JOIN然后RIGHT JOIN,因为你可以读到它 从我的主体实体中选择all(在FROM子句中),并尝试连接另一个存在连接数据的地方。但两者都应该相同
答案 1 :(得分:0)
您必须按员工表中的ID进行分组,而不是使用事务表中的ID进行分组,而是使用右连接。由于您希望在交易表中保留“null”的员工。
SELECT
CONCAT(s.Firstname, " ", s.Surname) AS `Staff Name`,
SUM(t.Points) AS `Points Allocated`
FROM transactions t
RIGHT JOIN staff s ON t.Giver_ID = s.ID
WHERE `Datetime` >= '2012-10-08'
GROUP BY s.ID
ORDER BY `Points Allocated` ASC