получить самый высокий средний балл, набранный учениками из каждой школы - PullRequest
1 голос
/ 22 апреля 2019

у меня есть таблицы

TBL_STD_MARKS 
SCHOOL_ID   SYMBOL_NO       AVG_GPA
1               211             3.8
1               255             3.5
1               212             2.90
2               311             3.85
2               312             3.75
3               411             2.98
3               412             3.00


TBL_STD_INFO
SCHOOL_ID   SYMBOL_NO   STUDENT_NAME    GENDER
1               211         S1              M   
1               255         S2              F
1               212         S3              M
2               311         S22             M
2               312         S23             M   
3               411         S31             M
3               412         S32             F   


TBL_SCHOOL
SCHOOL_ID       SCHOOL_NAME
1               SCHOOL11
2               SCHOOL22
3               SCHOOL33

Я пытаюсь написать запрос, чтобы получить самый высокий балл AVG_GPA среди учеников из каждой школы. Но мой запрос дает все строки таблицы.

 WITH cte
    AS (
        SELECT D.SCHOOL_NAME
            ,A.SYMBOL_NO
            ,B.STUDENT_NAME         
            ,B.GENDER
            ,A.AVG_GPA
        FROM TBL_STD_MARKS A
        INNER JOIN TBL_STD_INFO B ON A.SYMBOL_NO = B.SYMBOL_NO
        INNER JOIN TBL_SCHOOL D ON A.SCHOOL_ID = D.SCHOOL_ID
        )
    SELECT SCHOOL_NAME
            ,SYMBOL_NO
            ,STUDENT_NAME       
        ,MAX(DISTINCT CASE 
                WHEN GENDER = 'M'
                    THEN AVG_GPA
                END) AS MALE_GPA
        ,MAX(DISTINCT CASE 
                WHEN GENDER = 'F'
                    THEN AVG_GPA
                END) AS FEMALE_GPA
    FROM CTE
    GROUP BY SCHOOL_NAME,SYMBOL_NO
            ,STUDENT_NAME

Ответы [ 6 ]

2 голосов
/ 22 апреля 2019

использование row_number() оконная функция

     with cte as (  
          SELECT D.SCHOOL_NAME
        ,A.SYMBOL_NO
        ,B.STUDENT_NAME         
        ,B.GENDER
        ,A.AVG_GPA,row_number()over(partition by D.SCHOOL_NAME, B.GENDER order by A.AVG_GPA desc) rn
    FROM TBL_STD_MARKS A
    INNER JOIN TBL_STD_INFO B ON A.SYMBOL_NO = B.SYMBOL_NO
    INNER JOIN TBL_SCHOOL D ON A.SCHOOL_ID = D.SCHOOL_ID
    ) select * from cte where rn=1
0 голосов
/ 22 апреля 2019

Предположим, это наш стол.Запрос ниже поможет вам:

Select a.SchoolId, a.Gender,
  (Select max(GPA) From [Test].[guest].[School] where SchoolId = a.SchoolId and Gender = 
  a.Gender) as GPA
  from [Test].[guest].[School] a
  Group by SchoolId, Gender
0 голосов
/ 22 апреля 2019

выберите ts.School_Id, ts.School_Name, tsi.Gender, max (tsm.Avg_GPA) в качестве Avg_GPA из Tbl_School ts присоединиться к Tbl_Std_Info tsi в ts.School_Id = tsi.School_Id присоединиться к Tbl_Solm.TMпо ts.School_Id, ts.School_Name, tsi.Gender

enter image description here

0 голосов
/ 22 апреля 2019
SELECT std_marks.SCHOOL_ID,school.SCHOOL_NAME, std_info.GENDER, MAX(std_marks.AVG_GPA) 
as MAX_AVG_GPA
FROM TBL_STD_MARKS std_marks
INNER JOIN TBL_STD_INFO std_info ON std_info.SYMBOL_NO = std_marks.SYMBOL_NO
INNER JOIN TBL_SCHOOL school ON school.SCHOOL_ID = std_marks.SCHOOL_ID
GROUP BY std_info.GENDER, std_marks.SCHOOL_ID, school.SCHOOL_NAME
ORDER BY std_marks.SCHOOL_ID
0 голосов
/ 22 апреля 2019

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

SELECT tbs.SCHOOL_ID,
CASE WHEN GENDER = 'F' THEN
      MAX(AVG_GPA) END AS HighestFemaleGPA,
CASE WHEN GENDER = 'M' THEN
      MAX(AVG_GPA) END AS HighestMaleGPA
FROM @TBL_STD_MARKS stdM
INNER JOIN @TBL_SCHOOL tbs
ON  tbs.SCHOOL_ID = stdM.SCHOOL_ID
INNER JOIN @TBL_STD_INFO stdI
ON stdI.SYMBOL_NO = stdM.SYMBOL_NO
GROUP BY tbs.SCHOOL_ID,GENDER
0 голосов
/ 22 апреля 2019
select D.SCHOOL_NAME
        ,A.SYMBOL_NO
        ,B.STUDENT_NAME         
        ,B.GENDER
        ,A.AVG_GPA
    FROM TBL_STD_MARKS A
    INNER JOIN TBL_STD_INFO B ON A.SYMBOL_NO = B.SYMBOL_NO
    INNER JOIN TBL_SCHOOL D ON A.SCHOOL_ID = D.SCHOOL_ID
where B.GENDER='M' OR B.GENDER='F' and A.AVG_GPA=(select max(AVG_GPA) from TBL_STD_MARKS)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...