2015-01-19 2 views
0

Для простоты подумайте, что у меня есть запрос, который возвращает строку на основе student_id, и содержит метки из шести викторин с именами столбцов, такими как Quiz1 Quiz2 Quiz3 Quiz4 Quiz5 Quiz6.Выберите три самых высоких значения, сравнив разные столбцы в строке?

Я хочу выбрать только верхние 3 наивысших знака, безопасные для учащегося, а затем взять его среднее значение, а затем сравнить это значение среднего с другим столбцом «Pass_Avg» , если значение показателя 3-го наивысшего теста больше, чем равное до значения «Pass_Avg», просто просто измените значение столбца результата на «P» else 'F'.

Так я пытался получить наибольшее значение, делая что-то вроде этого

SELECT 
CASE 

    WHEN Quiz1 >= Quiz2 AND Quiz1 >= Quiz3 and Quiz1 >= Quiz4 and Quiz1 >= Quiz5 and Quiz1 >= Quiz6 THEN Quiz1 
    WHEN Quiz2 >= Quiz1 AND Quiz2 >= Quiz3 and Quiz2 >= Quiz4 and Quiz2 >= Quiz5 and Quiz2 >= Quiz6 THEN Quiz2 
    WHEN Quiz3 >= Quiz1 AND Quiz3 >= Quiz2 and Quiz3 >= Quiz4 and Quiz3 >= Quiz5 and Quiz3 >= Quiz6 THEN Quiz3 
    WHEN Quiz4 >= Quiz1 AND Quiz4 >= Quiz2 and Quiz4 >= Quiz3 and Quiz4 >= Quiz5 and Quiz4 >= Quiz6 THEN Quiz4 
    WHEN Quiz5 >= Quiz1 AND Quiz5 >= Quiz2 and Quiz5 >= Quiz3 and Quiz5 >= Quiz4 and Quiz5 >= Quiz6 THEN Quiz5 
    WHEN Quiz6 >= Quiz1 AND Quiz6 >= Quiz2 and Quiz6 >= Quiz3 and Quiz6 >= Quiz4 and Quiz6 >= Quiz5 THEN Quiz6 
    ELSE Quiz1 
    END AS Highest from dbo.Student where student_id= '01' 

Может ли один пожалуйста предположить, что, как я должен попытаться сделать это, так как я имею затруднение в получении второго и третьего самая высокая значение .....

+0

Итак, у каждого учащегося разные Pass_Avg? И вы принимаете три самых высоких результата теста ученика, добавляете их, делят сумму на три и сравниваете результат с Pass_Avg? Может ли быть NULL? Если да, разделите ли вы на два, если для ученика будет только два теста? –

+1

Почему бы вам не сделать другую таблицу с результатами теста? Хранение значений строк (что и должно быть в результатах теста) в столбцах - это ужасный дизайн базы данных. Что, если в следующем году появится новая викторина? – Jcl

+0

Сценарий разный, на самом деле я только меняю его для простоты и отвечу на ваши запросы: Итак, у каждого ученика есть другой Pass_Avg? ДА И вы принимаете три самых высоких результата теста ученика, добавляете их, делите сумму на три и сравниваете результат с Pass_Avg? ДА Может ли быть NULL? NO и если бы я мог изменить дизайн db, я бы определенно хотел бы, но я просто не могу надеяться, что вы понимаете :) –

ответ

0

Проблема ваша структура базы данных. У вас должна быть таблица student_quiz с student_id и quiz_id. Вместо этого у вас есть викторины в столбцах, что делает их доступ более сложным. Используйте UNION ALL для имитации лучшего дизайна базы данных. (Мы будем выбирать pass_avg вместе с ним, чтобы использовать его позже). Затем дайте номера строк записей для каждого учащегося, причем 1 - это самый высокий результат теста, 2 - второй и т. Д. Затем выберите лучшие три и сделайте свои скопления.

select 
    student_id, 
    sum(quiz), 
    min(pass_avg), 
    case when sum(quiz)/3 >= min(pass_avg) then 'yes' else 'no' end as passed 
from 
(
    select 
    student_id, 
    quiz, 
    pass_avg, 
    row_number() over (partition by student_id order by quiz desc) as rn 
    from 
    (
    select student_id, quiz1 as quiz, pass_avg from student 
    union all 
    select student_id, quiz2 as quiz, pass_avg from student 
    union all 
    select student_id, quiz3 as quiz, pass_avg from student 
    union all 
    select student_id, quiz4 as quiz, pass_avg from student 
    union all 
    select student_id, quiz5 as quiz, pass_avg from student 
    union all 
    select student_id, quiz6 as quiz, pass_avg from student 
) 
where rn in (1,2,3) 
group by student_id 
order by student_id 
0

ли что-то вроде этого:

select Quiz1,'Quiz1' from dbo.Student where student_id= '01' 
UNION ALL 
select Quiz2,'Quiz2' from dbo.Student where student_id= '01' 
UNIONA ALL 
... 
order by 1 desc 

Чтобы получить верхнюю 3? Поддерживает ли SQL Server LIMIT? Или это ТОЛЬКО ТОЛЬКО?

Попытка использования TOP:

select top 3 * from 
(
    select Quiz1,'Quiz1' from dbo.Student where student_id= '01' 
    UNION ALL 
    select Quiz2,'Quiz2' from dbo.Student where student_id= '01' 
    UNION ALL 
    ... 
    order by 1 desc 
) 

Может работать ...

+0

' TOP' only AFAIK – Jcl

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