我们有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
答案 0 :(得分:0)
这里有一个示例脚本,可以按照您希望的方式调整数据。它的作用:
#t
@GroupIDCols
@GroupIDSel
#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
'+@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