2016-06-09 45 views
1

对不起这个不太好的标题。合并来自SQL Query的结果,其中大部分值相同

我triyng合并在一起的结果集,以提供一些数据的快速查看。

如果我有这个疑问:

SELECT 
    tblPriv.ID, tblGroups.Name AS 'Group', tblPriv.User, tblPriv.Role 
FROM 
    tblPriv 
INNER JOIN 
    tblGroups on tblPriv.ID = tblGroups.ID 

返回这些结果:

ID GROUP USER ROLE 
--------------------------------- 
1  Taxes DAVE Admin 
1  Taxes JOHN Admin 
1  Taxes BOB  PowerUser 
2  Catering RON  Admin 
2  Catering JACK PowerUser 
2  Catering JIM  PowerUser 

(其中ID是关系说,一组,存储在另一个表)

什么我最想做的是获得1组的记录:

ID GROUP  ADMINS   POWERUSERS 
--------------------------------------------- 
1  Taxes  DAVE; JOHN;  BOB 
2  Catering  RON;   JACK; JIM; 

我事先知道角色 - 他们总是保持不变,并且不会添加新角色。

我该怎么做呢? (我也将包括其他关系表中的数据)

回答

1

为了您的具体问题:

select g.id, g.name, 
     stuff((select '; ' + p.user 
       from tblPriv p 
       where p.id = g.id and p.role = 'Admin' 
       for xml path ('') type 
      ).value('', 'varchar(max)' 
        ), 1, 2, '' 
      ) as admins, 
     stuff((select '; ' + p.user 
       from tblPriv p 
       where p.id = g.id and p.role = 'PowerUser' 
       for xml path ('') type 
      ).value('', 'varchar(max)' 
        ), 1, 2, '' 
      ) as PowerUsers 
from tblGroups g 
0

在MySQL中使用组CONCAT

SELECT 
    tblPriv.ID 
    , tblGroups.Name AS 'Group' 
    , group_concat(t1.User) AS ADMINS, group_concat(t2.User) AS POWERUSERS 
FROM tblPriv 
INNER JOIN tblGroups as t1 on t1.ID = tblGroups.ID and t1.user='ADMIN' 
INNER JOIN tblGroups as t2 on t2.ID = tblGroups.ID and t1.user='POWERUSER' 
GROUP BY tblPriv.ID 
1

标签TSQL,我想这是对MS SQL服务器:

DECLARE @users TABLE 
    (
     [ID] INT , 
     [GROUP] VARCHAR(8) , 
     [USER] VARCHAR(4) , 
     [ROLE] VARCHAR(9) 
    ); 

INSERT INTO @users 
     ([ID], [GROUP], [USER], [ROLE]) 
VALUES (1, 'Taxes', 'DAVE', 'Admin'), 
     (1, 'Taxes', 'JOHN', 'Admin'), 
     (1, 'Taxes', 'BOB', 'PowerUser'), 
     (2, 'Catering', 'RON', 'Admin'), 
     (2, 'Catering', 'JACK', 'PowerUser'), 
     (2, 'Catering', 'JIM', 'PowerUser'); 

WITH data (ID, [GROUP], [ROLE], [MEMBERS]) 
      AS (SELECT u.ID , 
         u.[GROUP] , 
         u.ROLE , 
         (SELECT [USER] + ';' 
          FROM  @users AS [u1] 
         WHERE  u.ID = u1.ID AND u.[GROUP] = u1.[GROUP] and u.ROLE = u1.ROLE 
         FOR 
          XML PATH('') 
         ) 
       FROM  @users AS [u] 
      ) 
    SELECT ID , 
      [GROUP] , 
      [Admin] AS [Admins] , 
      [PowerUser] AS [POWERUSERS] 
    FROM data PIVOT (MAX(MEMBERS) FOR [ROLE] IN ([Admin], [PowerUser])) pvt; 
2
SELECT 
DISTINCT tp.ID, 
tp.[GROUP], 
ISNULL(STUFF(Admins.Admins, 1, 1, ''), '') AS Admins, 
ISNULL(STUFF(PowerUsers.PowerUsers, 1, 1, ''), '') AS PowerUsers 
FROM tlbPriv AS tp 
OUTER APPLY 
(
    SELECT ' ' + tmp.[USER] + ';' 
    FROM tlbPriv AS tmp 
    WHERE tmp.ID = tp.ID AND [tmp].[ROLE] = 'Admin' FOR XML PATH('') 
)Admins(Admins) 
OUTER APPLY 
(
    SELECT ' ' + tmp.[USER] + ';' 
    FROM tlbPriv AS tmp 
    WHERE tmp.ID = tp.ID AND [tmp].[ROLE] = 'PowerUser' FOR XML PATH('') 
)PowerUsers(PowerUsers) 
相关问题