#sql-server-2008 #pivot
#sql-server-2008 #сводная
Вопрос:
Как вы можете найти максимальное количество нескольких столбцов, созданных в сводной таблице, используя запрос сводной таблицы SQL Server 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
Приведенная выше инструкция select имеет следующий вывод:
ConsPrecinct_name Candidate1 NumVotes1 Candidate2 NumVotes2 Winning Candidate
CP01 DOUG 4 LATH 2 Needs Data
CP01 DOUG 2 LATH 4 Needs Data
Цель состоит в том, чтобы поле «Победивший кандидат» было заполнено именем кандидата, набравшего наибольшее количество голосов в соответствующем поле NumVotes.
Комментарии:
1. 1 За предоставление полезного DDL для отвечающих.
Ответ №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
Комментарии:
1. Это отлично работает, спасибо! Теперь о операторе group by . Я не могу понять, как использовать это, чтобы вернуть «связь» в столбце «победитель-кандидат», а не в дополнительную строку в сводной таблице.
Ответ №2:
Попробуйте использовать оператор CASE:
CASE WHEN [DOUG] > [LATHE] THEN 'DOUG'
WHEN [DOUG] < [LATHE] THEN 'LATHE'
ELSE 'No winner'
END AS WinningCandidate
Комментарии:
1. Это упрощенный пример. Я должен был упомянуть, что у меня есть несколько выборов с участием 8 участников, поэтому я надеялся на другой способ.
Ответ №3:
Если это всего лишь несколько полей, вы можете использовать оператор CASE:
...
CASE WHEN NumVotes1 > NumVotes2 THEN Candidate1
WHEN NumVotes2 > NumVotes1 THEN Candidate2
ELSE 'TIE' END as WinningCandidate