2014-12-15 2 views
3

I have a table in this formatКак выполнить эту задачу с помощью SQL Server

  • Если студент имеет два studentsubjectstatus в Meritstudentperformance является Merit.
  • Если студент имеет два studentsubjectstatus в Passstudentperformance является Pass
  • Else является Fail

Так что я нужен новый studentperformance колонки и выход будет как этот

studentname  studentperformance 
    A     Fail 
    B     Merit 
    C     Pass 
    D     Fail 

ответ

1

Вы можете напишите заявку как:

;WITH CTE AS 
(SELECT studentname, 
     ROW_NUMBER() OVER (partition BY studentname,studentsubjectstatus ORDER BY educationmarks DESC) 
     AS rownum, 
     studentsubjectstatus   
    FROM @student) 
,CTE2 AS 
(
SELECT studentname , MAX(rownum) AS maxrow 
FROM CTE 
GROUP BY studentname 
) 
SELECT DISTINCT T1.studentname 
     ,CASE WHEN T1.rownum = 1 THEN 'Fail' ELSE 
     T1.studentsubjectstatus END AS studentperformance 
FROM CTE AS T1 
JOIN CTE2 AS T2 ON T1.studentname=T2.studentname AND T1.rownum=t2.maxrow 
1

Попробуйте это:

SELECT 
    studentName AS 'Student Name' 
    , CASE 
      WHEN Merit >= 2 
       THEN 'Merit' 
      WHEN Pass >= 2 
       THEN 'Pass' 
      ELSE 'Fail' 
     END AS 'Student Performance' 
(SELECT 
    studentName 
    , COUNT(CASE WHEN StudentSubjectStatus = 'Merit' THEN 1 ELSE 0 END) AS 'Merit' 
    , COUNT(CASE WHEN StudentSubjectStatus = 'Pass' THEN 1 ELSE 0 END) AS 'Pass' 

     -- counting how many subjects the student failed is not needed, 
     -- but for example purposes it has been added 

    , COUNT(CASE WHEN StudentSubjectStatus = 'Fail' THEN 1 ELSE 0 END) AS 'Fail' 
FROM Students 
GROUP BY studentName) 
1

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

SELECT studentname, 
     CASE 
     WHEN Sum(CASE 
        WHEN studentsubjectstatus = 'Merit' THEN 1 
        ELSE 0 
        END) > 1 THEN 'Merit' 
     WHEN Sum(CASE 
        WHEN studentsubjectstatus = 'pass' THEN 1 
        ELSE 0 
        END) > 1 THEN 'pass' 
     ELSE 'fail' 
     END 
FROM yourtable 
GROUP BY studentname 

ИЛИ

SELECT studentname, 
     CASE 
     WHEN Sum(CASE 
        WHEN studentsubjectstatus = 'Merit' THEN 1 
        ELSE 0 
        END) > 1 THEN 'Merit' 
     ELSE 
      CASE 
      WHEN Sum(CASE 
         WHEN studentsubjectstatus = 'pass' THEN 1 
         ELSE 0 
         END) > 1 THEN 'pass' 
      ELSE 'fail' 
      END 
     END AS studentperformance 
FROM yourtable 
GROUP BY studentname 

Примечание: > 1 условие может быть изменено на = 2 если вы хотите для подсчета точных 2 строк с определенными studentsubjectstatus.

0

Предполагая, что на одного учащегося всегда есть три предмета, вот идея.

Для каждого studentname:

  1. Count каждый studentsubjectstatus.

  2. Сортируйте результаты в порядке убывания количества, а затем в алфавитном порядке studentsubjectstatus (так что Fail станет первым в случае связей).

  3. Получить максимальный результат.

Так, что-то вроде этого:

SELECT DISTINCT 
    studentname, 
    studentperformance = (
    SELECT TOP (1) 
     s.studentsubjectstatus 
    FROM 
     dbo.yourtable AS s 
    WHERE 
     s.studentname = t.studentname 
    GROUP BY 
     s.studentsubjectstatus 
    ORDER BY 
     COUNT(*) DESC, 
     s.studentsubjectstatus ASC 
) 
FROM 
    dbo.yourtable AS t 
; 

Если вы не хотите, чтобы полагаться на алфавитном порядке значений в studentsubjectstatus, вы можете убедиться, что Fail приходит первым, заменив s.studentsubjectstatus ASC с чем-то например:

CASE s.studentsubjectstatus WHEN 'Fail' THEN 1 ELSE 2 END ASC