2014-02-04 3 views
0

Этот запрос работает отлично:Выборы запросов Надеюсь последний один

select rc.[race number], 
    max(case when seqnum = 1 then [candidate num] end) as Winner, 
    max(case when seqnum = 1 then Votes end) as WinningVotes, 
    max(case when seqnum = 1 then party end) as WinningParty, 
    max(case when seqnum = 1 then leader end) as Winner1, 
    max(case when seqnum = 1 then [leader percent] end) as WinnerPercent, 
    max(case when seqnum = 2 then [candidate num] end) as Loser, 
    max(case when seqnum = 2 then Votes end) as LosingVotes, 
    max(case when seqnum = 2 then party end) as LosingParty, 
    max(case when seqnum = 2 then leader2 end) as Loser2, 
    max(case when seqnum = 2 then [leader2 percent] end) as LoserPercent 

from 
(
select rc.[race number], 
     rc.[candidate num], 
     rc.[Votes], 
     rc.[winner], 
     c.[party], 
     r.[leader], 
     r.[leader percent], 
     r.[leader2], 
     r.[leader2 percent], 
      row_number() over (partition by rc.[race number] order by votes desc) as seqnum 
    from dbo.[RACE CANDIDATES] rc 
    inner join dbo.[CANDIDATE] c on rc.[candidate num] = c.[candidate number] 
    inner join dbo.[RACE] r 
    on rc.[race number] = r.[race number]   
) rc 
group by rc.[race number] 

Теперь у меня есть еще одно поле из RACE КАНДИДАТАМ TABLE, который должен отображаться в запросе. Он возвращает 0 для проигравшего и 1 для победителя. Этот столбец называется Winner. Когда я запускаю следующий запрос:

select rc.[race number], 
    max(case when seqnum = 1 then [candidate num] end) as Winner, 
    max(case when seqnum = 1 then Votes end) as WinningVotes, 
    max(case when seqnum = 1 then party end) as WinningParty, 
    max(case when seqnum = 1 then leader end) as Winner1, 
    max(case when seqnum = 1 then winner end) as WinnerSelected, 
    max(case when seqnum = 1 then [leader percent] end) as WinnerPercent, 
    max(case when seqnum = 2 then [candidate num] end) as Loser, 
    max(case when seqnum = 2 then Votes end) as LosingVotes, 
    max(case when seqnum = 2 then party end) as LosingParty, 
    max(case when seqnum = 2 then leader2 end) as Loser2, 
    max(case when seqnum = 2 then [leader2 percent] end) as LoserPercent, 
    max(case when seqnum = 2 then winner end) as LoserSelected 

from 
(
select rc.[race number], 
     rc.[candidate num], 
     rc.[Votes], 
     rc.[winner], 
     c.[party], 
     r.[leader], 
     r.[leader percent], 
     r.[leader2], 
     r.[leader2 percent], 
      row_number() over (partition by rc.[race number] order by votes desc) as seqnum 
    from dbo.[RACE CANDIDATES] rc 
    inner join dbo.[CANDIDATE] c on rc.[candidate num] = c.[candidate number] 
    inner join dbo.[RACE] r 
    on rc.[race number] = r.[race number]   
) rc 
group by rc.[race number] 

Я получаю сообщение об ошибке, которое утверждает: «Msg 8117, уровень 16, состояние 1, строка 6 Операнда типа данных бит недействителен для максимального оператора.»

Означает ли это, что я могу быть привинчен? Потому что в моем первом заявлении у меня есть кандидат с псевдонимом «Победитель», возможно, если бы я изменил это, это исчезло бы. Это то, что вызывает ошибку? Или это из-за возврата «0» или «1»?

Когда я запустил SELECT * FROM [RACE CANDIDATES], он возвращает столбец победителя с правильными «0» или «1».

Это мой последний вопрос, я обещаю.

Спасибо всем, кто направил меня через эту катастрофу.

ответ

0

С BIT столбец 1 или 0, вы не можете применить MAX() к нему. Единственный вариант, который я видел на других форумах, - это сделать его как tinyint. Вот так. Посмотрите, работает ли это.

select rc.[race number], 
    max(case when seqnum = 1 then [candidate num] end) as Winner, 
    max(case when seqnum = 1 then Votes end) as WinningVotes, 
    max(case when seqnum = 1 then party end) as WinningParty, 
    max(case when seqnum = 1 then leader end) as Winner1, 
    max(case when seqnum = 1 then CAST(winner AS tinyint) end) as WinnerSelected, 
    max(case when seqnum = 1 then [leader percent] end) as WinnerPercent, 
    max(case when seqnum = 2 then [candidate num] end) as Loser, 
    max(case when seqnum = 2 then Votes end) as LosingVotes, 
    max(case when seqnum = 2 then party end) as LosingParty, 
    max(case when seqnum = 2 then leader2 end) as Loser2, 
    max(case when seqnum = 2 then [leader2 percent] end) as LoserPercent, 
    max(case when seqnum = 2 then CAST(winner AS tinyint) end) as LoserSelected 

from 
(
select rc.[race number], 
     rc.[candidate num], 
     rc.[Votes], 
     rc.[winner], 
     c.[party], 
     r.[leader], 
     r.[leader percent], 
     r.[leader2], 
     r.[leader2 percent], 
      row_number() over (partition by rc.[race number] order by votes desc) as seqnum 
    from dbo.[RACE CANDIDATES] rc 
    inner join dbo.[CANDIDATE] c on rc.[candidate num] = c.[candidate number] 
    inner join dbo.[RACE] r 
    on rc.[race number] = r.[race number]   
) rc 
group by rc.[race number] 
+0

Есть ли способ, которым я могу обойти это? По-прежнему позволяя побеждаемым выбранным и проигравшим столбцам заполнять один набор строк? – user3242661

+0

Теперь, когда я просмотрел URL-адрес, опубликованный выше, могу ли я использовать MIN вместо max? или будет ли это fubar результаты? – user3242661

+0

Только что обновил мой ответ с возможным решением. – Shiva

Смежные вопросы