联接表上的SQL行连接
我读过类似的文章,但无法让我的查询起作用 以下是我所拥有的:联接表上的SQL行连接,sql,sql-server,Sql,Sql Server,我读过类似的文章,但无法让我的查询起作用 以下是我所拥有的: SELECT u.Id, U.FirstName as [Name], ut.UserType, COUNT(DISTINCT(s.rawScoreDate)) as [Total Sessions], COUNT(DISTINCT(s.SkillId)) AS [Skills Used], SUM(CASE WHEN s.score in (1, 2, 3) THEN 1 ELSE 0 END) AS [Total Scores]
SELECT u.Id,
U.FirstName as [Name],
ut.UserType,
COUNT(DISTINCT(s.rawScoreDate)) as [Total Sessions],
COUNT(DISTINCT(s.SkillId)) AS [Skills Used],
SUM(CASE WHEN s.score in (1, 2, 3) THEN 1 ELSE 0 END) AS [Total Scores],
SUM(CASE s.score WHEN 1 THEN 1 ELSE 0 END) AS [1's Scored],
SUM(CASE s.score WHEN 2 THEN 1 ELSE 0 END) AS [2's Scored],
SUM(CASE s.score WHEN 3 THEN 1 ELSE 0 END) AS [3's Scored],
CAST(100.0/NULLIF(SUM(CASE WHEN s.score in (1, 2, 3) THEN 1 ELSE 0 END),0) * SUM(CASE s.score WHEN 1 THEN 1 ELSE 0 END) AS NUMERIC(18,2)) AS [1's %],
CAST(100.0/NULLIF(SUM(CASE WHEN s.score in (1, 2, 3) THEN 1 ELSE 0 END),0) * SUM(CASE s.score WHEN 2 THEN 1 ELSE 0 END) AS NUMERIC(18,2)) AS [2's %],
CAST(100.0/NULLIF(SUM(CASE WHEN s.score in (1, 2, 3) THEN 1 ELSE 0 END),0) * SUM(CASE s.score WHEN 3 THEN 1 ELSE 0 END) AS NUMERIC(18,2)) AS [3's %],
(SELECT SkilsName as skls FROM tblSkils as sk where sk.SkilsId=s.SkillId) as [Skills]
FROM tblUser AS u
LEFT OUTER JOIN tblRawScore AS s ON (U.Id=s.AssignedBy) JOIN tblUserType AS ut ON (u.UserTypeId=ut.Id)
WHERE u.usertypeid=4
GROUP BY u.id, u.FirstName,ut.UserType,s.SkillId
ORDER BY [Total Sessions] DESC
当[Skills Used]仅为1时,这可以正常工作,但如果超过1,我假设它将返回第一个技能或结果中的重复行
有没有办法将[Skills]查询的结果放入字符串中,例如:
技能1,技能2,技能3
如果这是一个重复的问题,很抱歉,但我对复杂的SQL查询还很陌生。Code:
将此字段用作查询中的一个字段。多亏了jbarker,我才得以使用此字段:
SELECT u.Id,
U.FirstName as [Name],
ut.UserType,
COUNT(DISTINCT(s.rawScoreDate)) as [Total Sessions],
COUNT(DISTINCT(s.SkillId)) AS [Skills Used],
SUM(CASE WHEN s.score in (1, 2, 3) THEN 1 ELSE 0 END) AS [Total Scores],
SUM(CASE s.score WHEN 1 THEN 1 ELSE 0 END) AS [1's Scored],
SUM(CASE s.score WHEN 2 THEN 1 ELSE 0 END) AS [2's Scored],
SUM(CASE s.score WHEN 3 THEN 1 ELSE 0 END) AS [3's Scored],
CAST(100.0/NULLIF(SUM(CASE WHEN s.score in (1, 2, 3) THEN 1 ELSE 0 END),0) * SUM(CASE s.score WHEN 1 THEN 1 ELSE 0 END) AS NUMERIC(18,2)) AS [1's %],
CAST(100.0/NULLIF(SUM(CASE WHEN s.score in (1, 2, 3) THEN 1 ELSE 0 END),0) * SUM(CASE s.score WHEN 2 THEN 1 ELSE 0 END) AS NUMERIC(18,2)) AS [2's %],
CAST(100.0/NULLIF(SUM(CASE WHEN s.score in (1, 2, 3) THEN 1 ELSE 0 END),0) * SUM(CASE s.score WHEN 3 THEN 1 ELSE 0 END) AS NUMERIC(18,2)) AS [3's %],
STUFF(( SELECT ', ' + sk.SkilsName
FROM tblskils AS sk
WHERE sk.SkilsId=s.SkillId
FOR XML PATH('')),1,2,'') AS [Skills Used]
有一种方法可以将这样的技能结合起来。然而,由于您加入tblRawScore的方式,您每行只能获得一项技能(因此您将获得多行技能)。您可以将联接移动到子查询中,但不能引用tblRawScore以获取要在外部查询中选择的其他内容。你可以把它放在两个地方,但是你会得到每一个技能的一行,显示该技能的分数,然后结合使用的技能下的所有技能。话虽如此,你想要什么?谢谢,对我的目的来说不太合适,但是[让我走上正确的道路。非常感谢。我在我的答案中添加了where子句。再试一次。现在应该效果更好了。是的,太好了。谢谢你的帮助。
SELECT u.Id,
U.FirstName as [Name],
ut.UserType,
COUNT(DISTINCT(s.rawScoreDate)) as [Total Sessions],
COUNT(DISTINCT(s.SkillId)) AS [Skills Used],
SUM(CASE WHEN s.score in (1, 2, 3) THEN 1 ELSE 0 END) AS [Total Scores],
SUM(CASE s.score WHEN 1 THEN 1 ELSE 0 END) AS [1's Scored],
SUM(CASE s.score WHEN 2 THEN 1 ELSE 0 END) AS [2's Scored],
SUM(CASE s.score WHEN 3 THEN 1 ELSE 0 END) AS [3's Scored],
CAST(100.0/NULLIF(SUM(CASE WHEN s.score in (1, 2, 3) THEN 1 ELSE 0 END),0) * SUM(CASE s.score WHEN 1 THEN 1 ELSE 0 END) AS NUMERIC(18,2)) AS [1's %],
CAST(100.0/NULLIF(SUM(CASE WHEN s.score in (1, 2, 3) THEN 1 ELSE 0 END),0) * SUM(CASE s.score WHEN 2 THEN 1 ELSE 0 END) AS NUMERIC(18,2)) AS [2's %],
CAST(100.0/NULLIF(SUM(CASE WHEN s.score in (1, 2, 3) THEN 1 ELSE 0 END),0) * SUM(CASE s.score WHEN 3 THEN 1 ELSE 0 END) AS NUMERIC(18,2)) AS [3's %],
STUFF(( SELECT ', ' + sk.SkilsName
FROM tblskils AS sk
WHERE sk.SkilsId=s.SkillId
FOR XML PATH('')),1,2,'') AS [Skills Used]