2017-10-08 39 views
1

我想獲得一個SQL,可以給我帶來以下結果獨特的組合,但我似乎無法讓我的頭圍繞此特定情形。計數,並列出了按組

我想看看有多少用戶角色組合的單個組合有,並報告計數和列出角色的名字。

下面是示例表:

USER ROLE 
AAA Report 
AAA Enquiry 
AAA Manager 
BBB Report 
BBB Enquiry 
BBB Manager 
CCC Enquiry 
CCC Report 
DDD Report 
EEE Report 
EEE Enquiry 
EEE Admin 
FFF Report 
FFF Enquiry 
GGG Report 
GGG Enquiry 
GGG Manager 
GGG PAYROLL 
HHH Report 
III Report 
III Enquiry 

有AAA,BBB,並以「報告 - 探究式管理器」的角色組合,因此算上2的條記錄。

只有與調查,報告CCC。

有DDD和HHH與報告的作用。

因此,所需的輸出將

COUNT ROLE-COMBINATION 
2  Report-Enquiry-Manager 
3  Enquiry-Report 
2  Report 
1  Report-Enquiry-Admin 
1  Report-Enquiry-Manager-PAYROLL 

可能有人點我的方向是正確的,請。

感謝堆,

回答

2

可以用戶GROUP BY獲得數量和使用STUFF獲得-分離作用的值。

create table test 
(
    [USER] varchar(10) 
    ,[Role] varchar(100) 
) 
insert into test values 
('AAA','Report') 
,('AAA','Enquiry') 
,('AAA','Manager') 
,('BBB','Report') 
,('BBB','Enquiry') 
,('BBB','Manager') 
,('CCC','Enquiry') 
,('CCC','Report') 
,('DDD','Report') 
,('EEE','Report') 
,('EEE','Enquiry') 
,('EEE','Admin') 
,('FFF','Report') 
,('FFF','Enquiry') 
,('GGG','Report') 
,('GGG','Enquiry') 
,('GGG','Manager') 
,('GGG','PAYROLL') 
,('HHH','Report') 
,('III','Report') 
,('III','Enquiry') 


select COunt(1) as [COUNT], [Role-Combination] from 
(

select Count(1) as [Count], t.[User] 
,STUFF((SELECT 
         '-' + cm.[role] AS [text()] 
        FROM 
        test cm 
        WHERE 
        cm.[user] = t.[user] 
        order by [role] desc 
         FOR XML PATH('') 
         , root('user'), TYPE).value('.','varchar(max)'), 1, 1, '')AS [Role-Combination] 
from test t 
GROUP BY t.[User] 

) result 
group by result.[Role-Combination] 

DROP TABLE test 
+0

對不起,我只是noticed.What是爲了你'角色Combination'規則?或者是與「查詢報告」相同的「報告查詢」? –

+0

謝謝@ AB_87,報告 - 查詢與查詢報告相同:D – reilic

+1

@reilic然後,我提供的查詢應該爲您工作。 –

0
DECLARE @USER TABLE 
(
    xUSER VARCHAR(30), 
    xROLE VARCHAR(30) 
) 
INSERT INTO @USER (xUSER,xROLE) 
VALUES 
('AAA','Report'), 
('AAA','Enquiry'), 
('AAA','Manager'), 
('BBB','Report'), 
('BBB','Enquiry'), 
('BBB','Manager'), 
('CCC','Enquiry'), 
('CCC','Report'), 
('DDD','Report'), 
('EEE','Report'), 
('EEE','Enquiry'), 
('EEE','Admin'), 
('FFF','Report'), 
('FFF','Enquiry'), 
('GGG','Report'), 
('GGG','Enquiry'), 
('GGG','Manager'), 
('GGG','PAYROLL'), 
('HHH','Report'), 
('III','Report'), 
('III','Enquiry') 

; WITH x AS 
(
    SELECT DISTINCT 
     xUSER, 
     STUFF((
      SELECT '- ' + xRole 
      FROM @User 
      WHERE xUser = a.xUSer   
      ORDER BY xRole 
      FOR XML PATH ('') 
     ), 1, 1, '') Groups 
    FROM @User a 
) 
SELECT 
    [Cnt] = COUNT(xUser), Groups as [Role-Cmbine] 
FROM x 
GROUP BY Groups 
ORDER BY [Cnt] DESC