0

我正在运行一个学校奖励系统,在该系统中,工作人员将积分分配给学生的积极态度和行为。

我有两张桌子:

工作人员 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?不幸的是,我不确定从哪里开始。

提前致谢,

4

2 回答 2

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 和分组(在这两种情况下,如果您不想要空值,则在 SUM(t.Points) 上使用合并,您还必须检查“NULL transaction datetime”,或使用日期谓词加入

您会看到更多的 LEFT JOIN 然后 RIGHT JOIN,因为您可以将其读取为从我的主体实体中选择所有(在 FROM 子句中),并尝试在存在连接数据的地方加入另一个。但两者都应该工作相同

于 2012-10-11T14:39:36.130 回答
0

您必须按人员表中的 id 而不是事务表中的 id 进行分组,并改用右连接。由于您希望在交易表中保留“空”的员工。

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
于 2012-10-11T14:38:20.607 回答