TSQL Group By Issues

时间:2015-04-16 21:21:43

标签: sql-server tsql stored-procedures

我有一个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

2 个答案:

答案 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