2015-04-22 51 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語句的選定列。 –

相關問題