2013-08-26 10 views
5

Mam problem z utworzeniem instrukcji SQL dla sqlserver2008. Mam następujące dane:Instrukcja SQL dla dwóch kolumn grupowych

city  person  priority 
----------------------------------- 
Linz  Mike  1 
Wien  Mike  1 
Linz  Tom  1 
Wien  Tom  1 
Linz  John  1 
Linz  Sarah  2 

Oznacza to, że osoby Mike i Tom wybrać miast Linz i Wien z priorytetu 1.
John wybiera Linz z pierwszeństwem 1.
Sarah wybiera Linz z priorytetem 2.

teraz chcę następujący wynik:

cities   persons   priority 
----------------------------------- 
Linz, Wien  Mike, Tom  1 
Linz   John   1 
Linz   Sarah   2 

już mam następujący instrukcja_sql ale nie dostać oczekiwanego rezultatu jak ta kwerenda byłoby powiedzieć, że John posiada również wejście dla Wien z priorytetu 1.

SELECT 
(SELECT 
    STUFF((SELECT ', ' + d.City 
    FROM (SELECT DISTINCT d2.City FROM dbo.DummyTable d2 
     WHERE d2.Priority = d1.Priority) d 
    FOR XML PATH('')), 1, 2, '') 
) 
AS Cities, 
(SELECT 
    STUFF((SELECT ', ' + d.Person 
    FROM (SELECT DISTINCT d2.Person FROM dbo.DummyTable d2 
     WHERE d2.Priority = d1.Priority) d 
    FOR XML PATH('')), 1, 2, '') 
) 
AS Persons, 
d1.Priority 
FROM 
dbo.DummyTable d1 
GROUP BY d1.Priority 

można również skorzystać z tej SQL Fiddle

Jakieś pomysły, w jaki sposób zapytanie to można napisać w języku SQL?

Odpowiedz

4

oto sposób to zrobić:

;with PersonCityGroupPreferences as (
    select 
    Person, 
    Priority, 
    stuff ((
     select ', ' + d2.City 
     from DummyTable d2 
     where d1.Priority = d2.Priority 
      and d1.Person = d2.Person 
     FOR XML PATH('') 
    ), 1, 2, '') Cities 
    from DummyTable d1 
    group by Person, Priority 
) 
select 
    Cities, 
    stuff ((
    select ', ' + p2.Person 
    from PersonCityGroupPreferences p2 
    where p1.Cities = p2.Cities 
     and p1.Priority = p2.Priority 
    FOR XML PATH('') 
), 1, 2, '') Persons, 
    Priority 
from PersonCityGroupPreferences p1 
group by Priority, Cities 

SQLFiddle Link: http://www.sqlfiddle.com/#!3/d831d/57

Aby osiągnąć końcowy W wyniku tego podzieliłem rozwiązanie na dwa etapy:

  1. uzyskać zestaw wyników, które grupuje dane według Person i Priority i zawiera listę oddzielonych przecinkami miast jako trzeciej kolumnie

  2. Take zestaw wynik uzyskany punkt 1 i zrobić to samo, ale teraz grupowej według kolumn Cities (lista oddzielonych przecinkami) i Priority i tworzy listę odpowiednich osób oddzielonych przecinkami.

W kwerendzie powyżej, krok 1 jest to zapytanie:

select 
    Person, 
    Priority, 
    stuff ((
    select ', ' + d2.City 
    from DummyTable d2 
    where d1.Priority = d2.Priority 
    and d1.Person = d2.Person 
    FOR XML PATH('') 
), 1, 2, '') Cities 
from DummyTable d1 
group by Person, Priority 

Oto jak cząstkowe wyniki wyglądają w SQL: http://www.sqlfiddle.com/#!3/d831d/58

I wtedy narażone pierwsze zapytanie jako CTE, czyniąc jest dostępny dla (zewnętrznego) zapytania 2, które w zasadzie robi to samo, ale z innymi kryteriami grupowania.

0

myślę, że można to osiągnąć przy maks: http://www.sqlfiddle.com/#!3/d831d/26

SELECT 
(SELECT 
    STUFF((SELECT ', ' + d.City 
    FROM (SELECT DISTINCT d2.City FROM dbo.DummyTable d2 
     WHERE d2.Priority = d1.Priority and d2.City = d1.City) d 
    FOR XML PATH('')), 1, 2, '') 
) 
AS Cities, 
(SELECT 
    STUFF((SELECT ', ' + d.Person 
    FROM (SELECT DISTINCT d2.Person FROM dbo.DummyTable d2 
     WHERE d2.Priority = d1.Priority and d2.City = d1.City) d 
    FOR XML PATH('')), 1, 2, '') 
) 
AS Person, 
d1.Priority 
FROM 
dbo.DummyTable d1 
GROUP BY d1.Priority,d1.City