Một cách đơn giản để giải quyết này như tôi có thể nhìn thấy nó, là để xếp hạng tên của mỗi người của từng loại một cách độc lập với dấu hiệu xếp hạng khác nhau, tức là ví dụ, tên đầu tiên với tích cực bảng xếp hạng, họ với những tiêu cực. Sau đó, bạn chọn và các tên trục có thứ hạng của 1
, 2
, -1
, -2
. Dưới đây là những gì các truy vấn có thể trông giống như:
WITH ranked AS (
SELECT
*,
rnk =
CASE NameType WHEN 'first' THEN 1 ELSE -1 END *
ROW_NUMBER() OVER (
PARTITION BY PersonId, NameType
ORDER BY NameId
)
FROM PersonNames
WHERE NameType IN ('first', 'last')
)
SELECT
PersonId,
FName1 = [1],
FName2 = [2],
LName1 = [-1],
LName2 = [-2]
FROM (
SELECT
PersonId,
Name,
rnk
FROM ranked
) s
PIVOT (
MAX(Name) FOR rnk IN ([-2], [-1], [1], [2])
) p
Mặt khác, đứng tên cuối cùng từ cuối cùng có thể xuất hiện thích hợp hơn (ít nhất, tôi nghĩ rằng, tôi có thể thích nó tốt hơn theo cách này).Vì vậy, đây là giải pháp thay thế cho tập lệnh ở trên xếp hạng các tên cuối cùng từ cuối:
WITH ranked AS (
SELECT
*,
rnk =
CASE NameType WHEN 'first' THEN 1 ELSE -1 END *
ROW_NUMBER() OVER (
PARTITION BY PersonId, NameType
ORDER BY CASE NameType WHEN 'first' THEN 1 ELSE -1 END * NameId
)
FROM PersonNames
WHERE NameType IN ('first', 'last')
),
SELECT
PersonId,
FName1 = [1],
FName2 = [2],
LName1 = ISNULL([-2], [-1]),
LName2 = CASE WHEN [-2] IS NULL THEN NULL ELSE [-1] END
FROM (
SELECT
PersonId,
Name,
rnk
FROM ranked
) s
PIVOT (
MAX(Name) FOR rnk IN ([-2], [-1], [1], [2])
) p
Bạn có thể thấy rằng phiên bản này phức tạp hơn một chút. Đối với một điều, một sự thay đổi của dấu hiệu đã được áp dụng cho NameId
để đảm bảo phân loại của nó theo các hướng khác nhau cho các loại khác nhau.
Một điều khác là kéo tập kết quả cuối cùng. Bạn thấy đấy, nếu một người chỉ có hai hoặc nhiều tên cuối cùng, tập lệnh sẽ hiển thị chúng theo thứ tự như trong bảng: mục trước khi mục cuối cùng đến LName1
và mục cuối cùng sẽ chuyển đến LName2
. Nhưng trong trường hợp chính xác một tên cuối cùng, ý định của tôi là hiển thị nó là LName1
và LName2
để trống (giống như truy vấn đầu tiên sẽ làm). Do đó, như bạn có thể thấy, các biện pháp bổ sung phải được thực hiện để đảm bảo thứ tự hiển thị đó.
Liên kết 'Person' và' PersonNames' có liên quan như thế nào? Có 'PersonId' trong' PersonNames' mà bạn không hiển thị không? –
Có một PersonId trong personNames. –
Bạn có thể cho chúng tôi bảng ví dụ về PersonNames cho Người của bạn không? –