我希望有人能够帮助我。我有两个表,一个表有学生姓名,另一个表有每个学生每周要做的功课量(不是一个实际的例子)。只有一名学生完成了任何工作。我想看一张表格,显示所有学生以及他们每周做了多少工作(即使为空)。
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
下面显示了以上两个查询的输出-以及我要获得的输出-每周重复一次,显示所有学生,无论他们是否具有任何关联的值。
如果有人可以帮助我,我将非常感激。
你需要得到的所有组合Name
,Week
以及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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句