MS Access / SQL 服务器连接到 return 左侧的所有值 table 如果右侧缺失则为零

MS Access / SQL Server JOIN to return all values in left table and zero if missing in right

首先道歉,因为我认为标题可能使这个问题听起来比它需要的要难得多。

基本上,我有两个 table。简而言之,它是一个工作人员 table 和一个 "work completed" table。我正在尝试创建一个查询,其中 returns 所有员工以及他们以摘要行格式完成的工作总和。

两个table:

STAFF_TABLE

+------------+-------------+----------------+--------------+
| TM_StaffID | TM_TeamName | TM_TeamManager | TM_StaffName |
+------------+-------------+----------------+--------------+
|          1 | HA11        | David A        | Paul A       |
|          2 | HA11        | David A        | John A       |
|          3 | HA11        | David A        | Simon A      |
|          4 | HA11        | David A        | Peter A      |
+------------+-------------+----------------+--------------+

WORK_TABLE

+-------------+------------+----------+-------------+------------+---------------+-----------+
| PS_TeamName | PS_WorkID  | PS_Staff | PS_WorkType |  PS_Date   | PS_WeekEnding | PS_Points |
+-------------+------------+----------+-------------+------------+---------------+-----------+
| HA11        | 2066944422 |        1 | Dev         | 02/08/2018 | 05/08/2018    |         1 |
| HA11        | 1869145859 |        1 | * Misc.     | 02/08/2018 | 05/08/2018    |      0.75 |
| HA11        | 2063035829 |        3 | Plan        | 01/08/2018 | 05/08/2018    |         1 |
| HA11        | 2036440149 |        3 | * Misc.     | 02/08/2018 | 05/08/2018    |       0.5 |
| HA11        | 2063023753 |        3 | Patching    | 03/08/2018 | 05/08/2018    |      0.25 |
| HA11        | 2012358108 |        4 | Plan        | 03/08/2018 | 05/08/2018    |      0.25 |
| HA11        | 2074311499 |        4 | Dev         | 30/07/2018 | 05/08/2018    |         1 |
| HA11        | 2075770157 |        4 | Patching    | 01/08/2018 | 05/08/2018    |      0.75 |
| HA11        | 2059475039 |        4 | Patching    | 03/08/2018 | 05/08/2018    |      0.75 |
| HA11        | 2062057110 |        4 | Plan        | 30/07/2018 | 05/08/2018    |      0.25 |
| HA11        | 2043715055 |        4 | * Misc.     | 02/08/2018 | 05/08/2018    |      0.25 |
+-------------+------------+----------+-------------+------------+---------------+-----------+

我写的有效查询在这里:

SELECT 
    a.TM_StaffName AS [Staff], Nz(SUM(p.PS_Points), 0) AS [Total]
FROM 
    STAFF_TABLE AS a
LEFT JOIN 
    WORK_TABLE AS p ON (((a.TM_StaffID = p.PS_Staff) 
                    AND cdate(ps.PS_Date) >= #2018-07-30#) 
                    AND cdate(ps.PS_Date) <= #2018-08-05#)
WHERE 
    a.TM_TeamName = 'HA11'
GROUP BY 
    a.TM_StaffName;

问题是,移动到 SQL 服务器时,CDate 未被识别为函数,查询失败。删除 CDate 括号然后表示 "JOIN function is not supported"。我也尝试在日期前后保留 # 而不是 ',但是 returns 为零。

这似乎是一个奇怪的怪癖,但从列中删除 CDate 会破坏查询,因为 MS Access 中的连接不受支持。

本质上,是否有更好的方法来编写此查询,以便显示左侧 table 的所有员工姓名,如果右侧 table 没有匹配的记录,则显示零?

下面的 table 一种有效且简单的编写方法会在左侧返回 3 个名称和 3 个总数。但是 PS_Staff '2' 也应该显示并显示 0 而不是根本不出现。

+---------+-------+
|  Staff  | Total |
+---------+-------+
| Paul A  |  1.75 |
| Simon A |  1.75 |
| Peter A |  3.25 |
+---------+-------+

(Need John A - 0 to show in here)

如何使用 SQL 服务器实现此目的并将查询放入 MS Access VBA?

谢谢

试试这个(这适用于 sql 服务器)

DECLARE @STAFF_TABLE TABLE (TM_StaffID INT, TM_TeamName VARCHAR(100), TM_TeamManager VARCHAR(100), TM_StaffName VARCHAR(100))
INSERT INTO @STAFF_TABLE VALUES
 (1,'HA11','David A' ,'Paul A'),
(2,'HA11','David A' ,'John A'),
(3,'HA11','David A','Simon A'),
(4,'HA11','David A' ,'Peter A');
DECLARE @WORK_TABLE TABLE 
(PS_TeamName VARCHAR(100),PS_WorkID INT, PS_Staff INT,PS_WorkType VARCHAR(100), PS_Date DATE,  PS_WeekEnding DATE, PS_Points DECIMAL(9,2))
INSERT INTO @WORK_TABLE VALUES 
('HA11',2066944422,1,'Dev','2018-08-02',  '2018-08-05',   1),
('HA11',1869145859,1,'* Misc','2018-08-02',  '2018-08-05', 0.75),
('HA11',2063035829,3,'Plan','2018-08-01',  '2018-08-05', 1),
('HA11',2036440149,3,'* Misc','2018-08-02',  '2018-08-05', 0.5),
('HA11',2063023753,3,'Patching','2018-08-03',  '2018-08-05', 0.25),
('HA11',2012358108,4,'Plan','2018-08-03',  '2018-08-05', 0.25),
('HA11',2074311499,4,'Dev','2018-07-30',  '2018-08-05',1),
('HA11',2075770157,4,'Patching','2018-08-01',  '2018-08-05',0.75),
('HA11',2059475039,4,'Patching','2018-08-03',  '2018-08-05',  0.75),
('HA11',2062057110,4,'Plan','2018-07-30',  '2018-08-05',0.25),
('HA11',2043715055,4,'* Misc.','2018-08-02',  '2018-08-05', 0.25);


SELECT 
a.TM_TeamName as [Staff], 
a.TM_StaffName,
isnull(Sum(p.PS_Points),0) AS [Total]
FROM @STAFF_TABLE as a
LEFT JOIN @WORK_TABLE as p ON a.TM_StaffID = p.PS_Staff
AND p.PS_Date >= '2018-07-30' AND p.PS_Date <= '2018-08-05'
 WHERE a.TM_TeamName = 'HA11'
GROUP BY a.TM_TeamName ,a.TM_StaffName

输出

Staff   TM_StaffName    Total
HA11    John A  0.00
HA11    Paul A  1.75
HA11    Peter A 3.25
HA11    Simon A 1.75

使用查询在 sql 中创建视图,然后使用查询 link 视图来访问数据库。这样聚合就完成了

CREATE VIEW dbo.Data
AS
SELECT 
a.TM_TeamName as [Staff], 
a.TM_StaffName,
isnull(Sum(p.PS_Points),0) AS [Total]
FROM @STAFF_TABLE as a
LEFT JOIN @WORK_TABLE as p ON a.TM_StaffID = p.PS_Staff
AND p.PS_Date >= '2018-07-30' AND p.PS_Date <= '2018-08-05'
 WHERE a.TM_TeamName = 'HA11'
GROUP BY a.TM_TeamName ,a.TM_StaffName