2015-04-22 53 views
0

我们有一个Group表设置为前面有多少组ID有还是什么,他们被称为或有多少名有如下SQL Server 2008中:返回用户在不同的组

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

我不知道或者他们被称为什么。

我期待在一个表中得到每个人在每个不同组的列表(谁没有为1的IsActive状态)这样

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

这是在所有可能的?我只有SELECT访问数据库,所以创建临时表等。

感谢您看,

DT

+0

搜索'pivot' –

回答

0

在这里,你有一个转动的数据,你想要的方式一个示例脚本。它能做什么:

  1. 创建临时表#t与你给
  2. 确定群ID的动态枢转@GroupIDCols
  3. 确定群ID的在@GroupIDSel
  4. 支点动态选择的样本数据中#t数据。首先将行号分配给#t中的行以区分某个GroupID的人员(请参阅派生表t)。然后在派生表上使用PIVOT以获得所需的结果。

脚本:

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 
     '[email protected]+' 
    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 ('[email protected]+') 
     ) AS piv 
'; 

EXEC (@query); 

DROP TABLE #t; 

结果:

G1  G2  G3  G4 
Person1 Person2 Person1 Person4 
     Person4  
+0

哇,我不明白的是,在丝毫但它看起来不错! –

+0

@D_T为了更好地理解,可能有助于打印出每个子步骤,以便更好地了解查询的构建方式。例如,在创建'@ query'变量之后执行'PRINT @ query',并在SQL格式化程序中格式化(例如[this one](http://www.dpriver.com/pp/sqlformat.htm)) 。这样你就可以看到实际查询的样子。您也可以打印'@ GroupIDCols'来获得PIVOT子句的列规范,'@ GroupIDSel'可以查看SELECT语句的选定列。 –

相关问题