2011-10-19 43 views
5

Làm cách nào bạn có thể tìm thấy tối đa một số cột được tạo trong bảng tổng hợp bằng truy vấn bảng pivot SQL Server 2008?Tối đa SQL của nhiều cột trong bảng tổng hợp

Given:

create table ElectionResults_test 
(
    Total_Votes int, 
    Precinct_Name varchar(50), 
    Candidate_Name varchar(50) 
) 
insert into ElectionResults_test values (4,'CP01', 'DOUG') 
insert into ElectionResults_test values (2,'CP02', 'DOUG') 
insert into ElectionResults_test values (2,'CP01', 'LATHE') 
insert into ElectionResults_test values (4,'CP02', 'LATHE') 


    SELECT Precinct_Name as ConsPrecinct_Name, 'DOUG' AS Candidate1, [DOUG] AS NumVotes1, 
    'LATHE' AS Candidate2, [LATHE] AS NumVotes2, 'Needs Data' as WinningCandidate FROM 
    (Select Total_Votes, Precinct_Name, Candidate_Name from [ELECTIONRESULTS_test]) 
    as SourceTable pivot (sum(Total_Votes) for Candidate_Name in ([DOUG], [LATHE])) as PivotTable 

Các lựa chọn công bố trên có kết quả như sau:

ConsPrecinct_name Candidate1 NumVotes1 Candidate2 NumVotes2 Winning Candidate 
CP01    DOUG  4   LATH  2   Needs Data 
CP01    DOUG  2   LATH  4   Needs Data 

Mục đích là để có 'Chiến thắng Candidate' lĩnh vực dân cư với tên ứng cử viên có số phiếu nhất trong trường NumVotes tương ứng.

+2

+1 Để cung cấp DDL hữu ích cho người trả lời. –

Trả lời

1

Để đối phó với 8 cách cuộc thi một cách dễ dàng hơn, bạn có thể sử dụng CROSS APPLYVALUES , bạn cũng có thể muốn một số GROUP BY vì bạn chưa biết cách xử lý các mối quan hệ (điều này sẽ trả về nhiều hàng cho mỗi người chiến thắng)

SELECT Precinct_Name   AS ConsPrecinct_Name, 
     'DOUG'     AS Candidate1, 
     [DOUG]     AS NumVotes1, 
     'LATHE'    AS Candidate2, 
     [LATHE]    AS NumVotes2, 
     WinningCandidate.name AS WinningCandidate 
FROM (SELECT Total_Votes, 
       Precinct_Name, 
       Candidate_Name 
     FROM ElectionResults_test) AS SourceTable PIVOT (SUM(Total_Votes) FOR 
     Candidate_Name IN ([DOUG], [LATHE])) AS PivotTable 
CROSS APPLY (SELECT CASE 
          WHEN COUNT(*) = 1 THEN MAX(name) 
          ELSE 'Tie' 
          END AS name 
        FROM (SELECT TOP 1 WITH TIES name 
          FROM (VALUES('DOUG', [DOUG]), 
              ('LATHE', [LATHE])) Y(name, votes) 
          ORDER BY votes DESC) T)AS WinningCandidate 
+0

Điều này hoạt động tuyệt vời, cảm ơn! Bây giờ về nhóm theo tuyên bố. Tôi không thể tìm ra cách sử dụng điều đó để trả về "tie" trong cột ứng cử viên chiến thắng chứ không phải là một hàng bổ sung trong bảng tổng hợp. – Sebastian

+0

@ user1003976 - Xem chỉnh sửa. –

+0

Đẹp. Cám ơn rất nhiều. – Sebastian

0

Nếu nó chỉ là một vài lĩnh vực mà bạn có thể sử dụng một lệnh CASE:

... 
CASE WHEN NumVotes1 > NumVotes2 THEN Candidate1 
    WHEN NumVotes2 > NumVotes1 THEN Candidate2 
    ELSE 'TIE' END as WinningCandidate 
1

Hãy thử một tuyên bố CASE:

CASE WHEN [DOUG] > [LATHE] THEN 'DOUG' 
    WHEN [DOUG] < [LATHE] THEN 'LATHE' 
    ELSE 'No winner' 
END AS WinningCandidate 
+0

Đây là một ví dụ đơn giản. Tôi nên nói rằng tôi có một số cuộc bầu cử với 8 thí sinh, vì vậy tôi đã hy vọng một cách khác. – Sebastian

Các vấn đề liên quan