我有一个TSQL查询,我试图将数据分组。该表包含用户及其拥有的访问密钥的记录,例如站点管理员,主持人等.PK在用户和访问密钥上,因为用户可以使用不同的密钥多次存在。
我现在正在尝试显示所有用户的表格,并在一列中显示用户持有的所有密钥。
如果bob的三个单独的访问密钥有三个单独的记录,那么结果应该只有一个bob记录,其中三个都是访问级别。
SELECT A.[FirstName],
A.[LastName],
A.[ntid],
A.[qid],
C.FirstName AS addedFirstName,
C.LastName AS addedLastName,
C.NTID AS addedNTID,
CONVERT(VARCHAR(100), p.TIMESTAMP, 101) AS timestamp,
(
SELECT k.accessKey,
k.keyDescription
FROM TFS_AdhocKeys AS k
WHERE p.accessKey = k.accessKey
FOR XML PATH ('key'), TYPE, ELEMENTS, ROOT ('keys')
)
FROM TFS_AdhocPermissions AS p
LEFT OUTER JOIN dbo.EmployeeTable as A
ON p.QID = A.QID
LEFT OUTER JOIN dbo.EmployeeTable AS C
ON p.addedBy = C.QID
GROUP BY a.qid
FOR XML PATH ('data'), TYPE, ELEMENTS, ROOT ('root');
END
我试图通过a.qid对数据进行分组,但是它强迫我对select中的每一列进行分组,然后这些列将不是唯一的,因此它将包含重复项。
另一种解决方法是什么?
目前:
UserID | accessKey
123 | admin
123 | moderator
渴望:
UserID | accessKey
123 | admin
moderator
答案 0 :(得分:0)
最近,我正在做一些事情并遇到类似的问题。就像你的查询一样,我有一个内在的' for xml'加入外部' for xml'。事实证明,如果连接位于内部' for xml'它会更好。代码粘贴在下面。我希望这会有所帮助。
Select
(Select Institution.Name, Institution.Id
, (Select Course.Courses_Id, Course.Expires, Course.Name
From
(Select Course.Courses_Id, Course.Expires, Courses.Name
From Institutions Course Course Join Courses On Course.Courses_Id = Courses.Id
Where Course.Institutions_Id = 31) As Course
For Xml Auto, Type, Elements) As Courses
From Institutions Institution
For Xml Auto, Elements, Root('Institutions') )
答案 1 :(得分:0)
由于我没有其他表的定义,我只是制作一个示例测试数据,你可以按照这个来回答你的。
创建声明
CREATE TABLE #test(UserId INT, AccessLevel VARCHAR(20))
插入样本数据
INSERT INTO #test VALUES(123, 'admin')
,(123, 'moderator')
,(123, 'registered')
,(124, 'moderator')
,(124, 'registered')
,(125, 'admin')
使用ROW_NUMBER()
可以实现您的需求
;WITH C AS(
SELECT ROW_NUMBER() OVER(PARTITION BY UserId ORDER BY UserId) As Rn
,UserId
,AccessLevel
FROM #test
)
SELECT CASE Rn
WHEN 1 THEN UserId
ELSE NULL
END AS UserId
,AccessLevel
FROM C
<强>输出强>
UserId AccessLevel
------ -----------
123 admin
NULL moderator
NULL registered
124 moderator
NULL registered
125 admin