2017-10-08 6 views
1

Ich möchte eine SQL ableiten, die mir das folgende Ergebnis bringen kann, aber ich kann einfach nicht scheinen, mich in diesem bestimmten Szenario zu beschäftigen.Zählen und listet einzigartige Kombination nach Gruppe

Ich möchte sehen, wie viele individuelle Kombination von ROLE-Kombination von USER gibt, und melden Sie die Anzahl und Liste von Rollennamen. Hier

ist die Beispieltabelle:

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 

Es gibt AAA und BBB mit Rollenkombination von "Report-Anfrage-Manager", also von 2 recored zählen.

Es gibt nur CCC mit Inquiry-Report.

Es gibt DDD und HHH mit Rolle von Report.

Daher würde der gewünschte Ausgang

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

Könnte mich jemand auf die richtige Richtung bitte.

Dankhaufen,

Antwort

2

Sie Benutzer GROUP BY können zu bekommen Count und STUFF verwenden - getrennt Rolle Werte zu erhalten.

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

Sorry, ich nur noticed.What die Regel Ihre 'Rollen Combination' bestellen? oder ist 'Report-Enquiry' gleich wie 'Inquiry-Report'? –

+0

Danke @ AB_87, Report-Inquiry wie Anfragen-Report: D – reilic

+1

@reilich Dann sollte die von mir gestellte Abfrage für dich funktionieren. –

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 
Verwandte Themen