2013-08-26 76 views
5

Tôi gặp sự cố khi tạo câu lệnh SQL cho sqlserver2008. Tôi có các dữ liệu sau:Câu lệnh SQL cho hai nhóm cột

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

Điều này có nghĩa rằng người MikeTom chọn các thành phố LinzWien với ưu tiên 1.
John chọn Linz với ưu tiên 1.
Sarah chọn Linz với mức độ ưu tiên 2.

bây giờ tôi muốn đầu ra sau đây:

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

Tôi đã có sau SQL Statement nhưng tôi không nhận được kết quả mong đợi như truy vấn này sẽ nói rằng John cũng có một mục nhập cho Wien ưu tiên 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 

Bạn cũng có thể sử dụng này SQL Fiddle

Bất kỳ ý tưởng nào về cách truy vấn này có thể được viết bằng SQL?

Trả lời

4

Đây là một cách để làm điều đó:

;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 liên kết: http://www.sqlfiddle.com/#!3/d831d/57

Để đạt được trận chung kết kết quả, tôi chia giải pháp thành hai bước:

  1. Có được một tập hợp kết quả mà nhóm các dữ liệu bằng cách PersonPriority và chứa danh sách bằng dấu phẩy của các thành phố như một cột thứ ba

  2. Hãy tập hợp kết quả thu được một điểm 1 và làm điều tương tự, nhưng bây giờ nhóm theo các cột Cities (danh sách được phân tách bằng dấu phẩy) và Priority và tạo danh sách được phân tách bằng dấu phẩy của những người tương ứng.

Trong các truy vấn trên, bước 1 là truy vấn này:

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 

Sau đây là cách kết quả từng phần tìm trong SQL: http://www.sqlfiddle.com/#!3/d831d/58

sau đó tôi tiếp xúc với truy vấn đầu tiên như một CTE, làm cho nó có sẵn cho truy vấn (bên ngoài) 2, về cơ bản thực hiện điều tương tự, nhưng với một tiêu chí nhóm khác nhau.

0

Tôi nghĩ rằng bạn có thể đạt được điều này tại tối đa: 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