J'ai des tableaux
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
J'essaie d'écrire une requête pour obtenir le meilleur score de AVG_GPA par les étudiants et étudiantes de chaque école. Mais ma requête donne toutes les lignes du tableau.
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
6 Réponses :
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)
Essayez ceci
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
utilisez la fonction de fenêtre 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
Que faire si je veux commander par AVG_GPA, je veux dire que l'étudiant masculin ou féminin avec le GPA le plus élevé devrait être en haut, puis l'étudiant masculin ou féminin correspondant de la même école. J'ai essayé en rejoignant select * from cte où rn = 1 order by AVG_GPA desc mais c'est en passant commande par AVG_GPA uniquement. Veuillez aider !!!
@nischalinn je ne comprends pas ce que vous avez demandé, pouvez-vous s'il vous plaît poser une nouvelle question avec un exemple de données approprié car je pense que ma réponse est déjà résolue votre problème actuel
cette requête affiche le résultat par ordre par nom_école. mais que faire si je veux montrer l'école avec le GPA le plus élevé en plus.
utiliser order by AVG_GPA desc
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
Supposons que ce soit notre tableau. La requête ci-dessous vous aidera:
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