2016-10-09 4 views
-1

Ich habe diese TabelleSUM und ORDER BY

Pupil ID Fname Lname Form House Week Nr  Data 
104  fname1 lname1 Year 5W Junior Frobisher 3 5 
106  fname2 lname2 Year 4W Junior Grenville 2 5 
106  fname2 lname2 Year 4W Junior Grenville 3 4 
106  fname2 lname2 Year 4W Junior Grenville 4 3 
106  fname2 lname2 Year 4W Junior Grenville 5 5 
107  fname3 lname3 Year 5W Junior Grenville 1 1 
107  fname3 lname3 Year 5W Junior Grenville 2 3 
107  fname3 lname3 Year 5W Junior Grenville 3 5 
107  fname3 lname3 Year 5W Junior Grenville 4 1 

SELECT PPD.PupilID, PPD.Forename, PPD.Surname, FL.[Description] AS 'Form', HL.[Description] AS 'House', CAST(REPLACE(CM.ColumnTitle, 'Week ', '') AS INT) AS 'WeekNo',CAST(MSDN.Data AS INT) AS 'Data', SUM(CAST(MSDN.Data AS INT)) AS 'Total' 
FROM CurrentPupil 
INNER JOIN PupilPersonalDetails AS PPD ON PPD.PupilID = CurrentPupil.PupilID 
INNER JOIN PupilCurrentSchool AS PCS ON PCS.PupilID = PPD.PupilID 
INNER JOIN SchoolLookupDetails AS FL ON PCS.Form = FL.LookupDetailsID AND FL.LookupID = 1002 
INNER JOIN SchoolLookupDetails AS HL ON PCS.House = HL.LookupDetailsID AND HL.LookupID = 1001 
INNER JOIN MarksheetDataNumeric AS MSDN ON MSDN.PupilID = PPD.PupilID 
INNER JOIN ColumnsMaster AS CM ON CM.ColumnID = MSDN.ColumnID AND CM.ColumnTitle LIKE '%week%' 
INNER JOIN ClusterMaster AS CLM ON CLM.ClusterID = SUBSTRING(PPD.SchoolID, 0, 4) 
INNER JOIN ColumnReportingPeriods AS CRP ON CRP.ColumnID = CM.ColumnID 
INNER JOIN ReportingPeriods AS RP ON RP.AcademicYear = CLM.CurrentAcademicYear AND RP.ReportingPeriodID = CRP.ReportingPeriodID 
WHERE ('%wc%' = '%wc%') 
GROUP BY PPD.PupilID 

Ich versuche

die folgende Spalte CAST (MSDN.Data AS INT) AS 'Daten' zu summieren und eine neue als hinzufügen Gesamtpunkte für jede ID (Schüler) CAST (MSDN.Daten AS INT) AS 'Daten', SUMME (CAST (MSDN.Data AS INT)) AS 'Gesamt', (ich denke, es ist richtig!) aber die Ergebnis ist: Spalte PupilPersonalDetails.ForeName ist in der Auswahlliste ungültig, da es nicht in einer Aggregatfunktion oder dem GRO enthalten ist UP BY-Klausel.

+0

Sie müssen nicht MSDN.Data zu INT, aber MSDN.Data und SUM (MSDN.Data) nicht in einer Auswahl gemäß Ihrem Fall haben. –

+0

In den meisten Datenbanken müssen die Felder, die Sie in der Auswahl verwenden, auch in GROUP BY sein. Außer denen in einer Aggregatfunktion wie MAX, SUM, ... – LukStorms

Antwort

0

starten von hier:

SELECT PPD.PupilID 
,PPD.Forename 
,PPD.Surname 
,SUM(MSDN.Data) 'Total' 
FROM CurrentPupil 
INNER JOIN PupilPersonalDetails PPD ON PPD.PupilID=CurrentPupil.PupilID 
INNER JOIN PupilCurrentSchool PCS ON PCS.PupilID=PPD.PupilID 
INNER JOIN SchoolLookupDetails FL ON PCS.Form=FL.LookupDetailsID AND FL.LookupID=1002 
INNER JOIN SchoolLookupDetails HL ON PCS.House=HL.LookupDetailsID AND HL.LookupID=1001 
INNER JOIN MarksheetDataNumeric MSDN ON MSDN.PupilID=PPD.PupilID 
INNER JOIN ColumnsMaster CM ON CM.ColumnID=MSDN.ColumnID AND CM.ColumnTitle LIKE '%week%' 
INNER JOIN ClusterMaster CLM ON CLM.ClusterID=SUBSTRING(PPD.SchoolID,0,4) 
INNER JOIN ColumnReportingPeriods CRP ON CRP.ColumnID=CM.ColumnID 
INNER JOIN ReportingPeriods RP ON RP.AcademicYear=CLM.CurrentAcademicYear AND RP.ReportingPeriodID=CRP.ReportingPeriodID 
WHERE ('%wc%'='%wc%') 
GROUP BY PPD.PupilID 
,PPD.Forename 
,PPD.Surname 

Wenn Sie möchten mehr Spalten im Ergebnis haben Sie sie hinzufügen können, aber da Sie eine Aggregationsfunktion SUM verwenden haben Sie alle diese Spalten haben - mit Ausnahme der Sie aggregieren (in diesem Fall summierend) - in der GROUP BY-Klausel erwähnt.

+0

Vielen Dank, dass ein Leckerbissen funktioniert. wenn ich nur die Aufzeichnungen mit 17 Punkten rereiven möchte .. ist das richtig? WHERE ('% wc%' = '% wc%') UND Total = 17 –

+0

Nein. Sie müssen die HAVING-Klausel hinzufügen, wenn Sie die Aggregate filtern wollen. Also: .... WHERE ('% wc%' = '% WC%') GRUPPE NACH PPD.PupilID , PPD.Forename , PPD.Surname HAVING SUM (MSDN.Data) = 17. Wenn ich geholfen habe, bitte bewerte meine Antwort. –

+0

Und noch eins: ('% wc%' = '% wc%') ist in diesem Fall nutzlos. Es bedeutet dasselbe wie 1 = 1 - es ist immer wahr. Da WHERE ein Filter für Zeilen - keine Aggregate - ist, werden in Ihrem Fall keine Zeilen entfernt, da es immer als wahr ausgewertet wird. Sie können die WHERE-Klausel entfernen. –