连接表显示每周的所有记录

我_1706

我希望有人能够帮助我。我有两个表,一个表有学生姓名,另一个表有每个学生每周要做的功课量(不是一个实际的例子)。只有一名学生完成了任何工作。我想看一张表格,显示所有学生以及他们每周做了多少工作(即使为空)。

CREATE TABLE #NAME (Name VARCHAR(20))

INSERT INTO #NAME VALUES
('John'),('Tom'),('Jack')

CREATE TABLE #TIME (Name VARCHAR(20), Week INT, Year INT, Total INT)

INSERT INTO #TIME VALUES
('John',1,2017,34),('John',2,2017,24),('John',3,2017,65),('John',4,2017,22),('John',5,2017,45)

我认为左外部联接会起作用-但它仅引用名称之间的联接,而不是星期

SELECT 
#Name.Name,
#Time.Week,
#Time.Year,
#Time.Total

FROM #NAME LEFT OUTER JOIN #Time ON #NAME.Name = #Time.Name

我尝试了外部申请-但实际上得到了相同的东西-

SELECT 
#Name.Name,
A.Week,
A.Year,
A.Total

FROM #NAME OUTER APPLY (SELECT * FROM #TIme WHERE #Name.Name = #Time.Name) A 

下面显示了以上两个查询的输出-以及我要获得的输出-每周重复一次,显示所有学生,无论他们是否具有任何关联的值。

在此处输入图片说明

如果有人可以帮助我,我将非常感激。

菲利克斯·帕米坦(Felix Pamittan)

你需要得到的所有组合NameWeek以及Year,然后做一个LEFT JOIN#TIME以获得所需的结果:

WITH CteNameWeekYear(Name, [Week], [Year]) AS(
    SELECT
        n.*, t.*
    FROM(
        SELECT DISTINCT [Week], [Year]  FROM #TIME
    ) t
    CROSS JOIN #Name n
)
SELECT
    c.Name,
    c.[Week],
    c.[Year],
    t.Total
FROM CteNameWeekYear c
LEFT JOIN #TIME t
    ON c.Name = t.Name
    AND c.[Year] = t.[Year]
    AND c.[Week] = t.[Week]
ORDER BY c.[Year], c.[Week], c.Name;

ONLINE DEMO

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章