2011-10-19 14 views
5

में एकाधिक कॉलम का एसक्यूएल अधिकतम SQL सर्वर 2008 पिवट तालिका क्वेरी का उपयोग करते हुए पिवोट तालिका में बनाए गए कई स्तंभों को अधिकतम कैसे प्राप्त कर सकते हैं?पिवट तालिका

को देखते हुए:

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 

चयन बयान से ऊपर निम्नलिखित आउटपुट है:

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

लक्ष्य 'जीतना उम्मीदवार' फ़ील्ड उम्मीदवार ऐसा नाम है जो सबसे ज्यादा वोट के साथ आबादी है संबंधित न्यूमोट्स क्षेत्र में।

+2

+1 उत्तरदाताओं के लिए उपयोगी डीडीएल प्रदान करने के लिए। –

उत्तर

1

8 तरीका से निपटने के लिए स्पर्धाओं उतनी ही आसानी से CROSS APPLY और VALUES उपयोग कर सकते हैं , आप GROUP BY भी चाह सकते हैं क्योंकि आपने यह नहीं कहा है कि संबंधों को कैसे प्रबंधित किया जाएगा (यह प्रत्येक विजेता के लिए कई पंक्तियां वापस कर देगा)

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

यह बहुत अच्छा काम करता है, धन्यवाद! अब कथन द्वारा समूह के बारे में। मैं यह नहीं समझ सकता कि पिवोट टेबल में अतिरिक्त पंक्ति के बजाय जीतने वाले उम्मीदवार कॉलम में "टाई" वापस करने के लिए इसका उपयोग कैसे किया जाए। – Sebastian

+0

@ user1003976 - संपादन देखें। –

+0

सुंदर। बहुत बहुत धन्यवाद। – Sebastian

0

तो यह केवल कुछ क्षेत्रों है कि आप एक मामला बयान का उपयोग कर सकते हैं:

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

एक मामला बयान का प्रयास करें:

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

यह एक सरलीकृत उदाहरण है। मुझे यह उल्लेख करना चाहिए था कि मेरे पास 8 प्रतियोगियों के साथ कुछ चुनाव हैं, इसलिए मैं एक और तरीके की उम्मीद कर रहा था। – Sebastian

संबंधित मुद्दे