SQL Server 2008:返回DISTINCT组中的用户

时间:2015-04-22 23:41:44

标签: sql-server-2008

我们有Group表格设置如下

GroupID  InActive  Name
G1       0         Person1
G2       0         Person2
G3       0         Person1
G1       1         Person3
G2       0         Person4
G4       0         Person4

我事先并不知道有多少GroupID,或者它们被叫什么,或者有多少名称或者叫什么。

我希望在这样的表格中获取每个不同组中的每个人的列表(谁没有IsActive状态为1)

G1       G2       G3       G4       etc...
Person1  Person2  Person1  Person4
         Person4

这一切都可能吗?我只有SELECT访问数据库,因此创建临时表等。

感谢您的关注,

DT

1 个答案:

答案 0 :(得分:0)

这里有一个示例脚本,可以按照您希望的方式调整数据。它的作用:

  1. 使用您提供的示例数据创建临时表#t
  2. 确定要在@GroupIDCols
  3. 中动态调整的GroupID
  4. 确定要在@GroupIDSel
  5. 中动态选择的GroupID
  6. #t中隐藏数据。首先,为#t中的行分配行号,以区分某个GroupID的人员(请参阅派生表t)。然后在派生表上使用PIVOT来获得所需的结果。
  7. 剧本:

    CREATE TABLE #t(
        GroupID CHAR(2),
        InActive BIT,
        Name VARCHAR(16)
    );
    
    INSERT INTO #t
        (GroupID,InActive,Name)
    VALUES
        ('G1',0,'Person1'),
        ('G2',0,'Person2'),
        ('G3',0,'Person1'),
        ('G1',1,'Person3'),
        ('G2',0,'Person4'),
        ('G4',0,'Person4');
    
    DECLARE @GroupIDCols VARCHAR(MAX);
    SET @GroupIDCols=STUFF(
        (SELECT DISTINCT
            ','+QUOTENAME(GroupID)
        FROM
            #t
        WHERE
            InActive=0
        FOR 
            XML PATH('')    
        )
        ,1
        ,1
        ,''
    );
    
    DECLARE @GroupIDSel VARCHAR(MAX);
    SET @GroupIDSel=STUFF(
        (SELECT DISTINCT
            ',COALESCE('+QUOTENAME(GroupID)+','''') AS '+QUOTENAME(GroupID)
        FROM
            #t
        WHERE
            InActive=0
        FOR 
            XML PATH('')    
        )
        ,1
        ,1
        ,''
    );
    
    
    DECLARE @query VARCHAR(MAX);
    SET @query='
        SELECT
            '+@GroupIDSel+'
        FROM
            (
                SELECT
                    GroupID,
                    Name,
                    ROW_NUMBER() OVER (PARTITION BY GroupID ORDER BY Name) AS rn
                FROM
                    #t
                WHERE
                    InActive=0
            ) AS t
            PIVOT(
                MAX(Name)
                FOR GroupID IN ('+@GroupIDCols+')
            ) AS piv
    ';
    
    EXEC (@query);
    
    DROP TABLE #t;
    

    结果:

    G1      G2      G3      G4
    Person1 Person2 Person1 Person4
            Person4