2017-08-10 4 views
1

Nachdem ich mehr als 3 Stunden dafür ausgegeben habe, gab ich auf.Wählen Sie Summen, um nur einen Datensatz in SQL Server zurückzugeben

ich vier Tabellen:

Users, Approvals, Centers, Managements 

Mein Ziel ist es, die Gesamtzahl der Nutzer in jeder Verwaltung durch die Benutzerrolle getrennt zu bekommen (ich habe zwei Rollen hier: Eltern und Mitglieder der Gesellschaft)

ich habe mit dem folgenden Code

select 
    (select count(r.StudentId) 
    from Users u 
    where u.UserId = r.StudentId and u.RoleId = 10) as Parents, 
    (select count(r.StudentId) 
    from Users u 
    where u.UserId = r.StudentId and u.RoleId = 11) as SocietyMembers, 
    e.ManagementId, e.ManagmentTitle 
from 
    CentersRegistrationsApprovals r --ON r.StudentId = u.UserId 
inner join 
    Centers c ON c.CenterId = r.CenterId 
inner join 
    Managments e ON e.ManagementId = c.EducationManagementId 
group by 
    e.ManagementId, e.ManagmentTitle, StudentId 

ich das Abfrageergebnis ginge davon aus, wie die folgende sein:

Parents SocietyMambers ManagementId ManagementName 
---------------------------------------------------------------- 
3   3    10    North Region 

Allerdings setzt das Ergebnis immer gibt mir Irgendwelche Ideen

Parents SocietyMambers ManagementId ManagementName 
---------------------------------------------------------------- 
3   NULL    10    North Region 
NULL  3    10    North Region 

, wie man nur 1 Datensatz das Ergebnis zu konsolidieren?

+5

entfernen Gruppe von StudentID –

+0

@KannanKandasamy dann können Sie es nicht in SELECT-Klausel –

Antwort

1

Bitte versuchen Sie so etwas wie dieses (nicht getestet)

; with CTE1 as (
    select 
     (select count(r.StudentId) 
     from Users u 
     where u.UserId = r.StudentId and u.RoleId = 10) as Parents, 
     (select count(r.StudentId) 
     from Users u 
     where u.UserId = r.StudentId and u.RoleId = 11) as SocietyMembers, 
     e.ManagementId, e.ManagmentTitle 
    from 
     CentersRegistrationsApprovals r --ON r.StudentId = u.UserId 
    inner join 
     Centers c ON c.CenterId = r.CenterId 
    inner join 
     Managments e ON e.ManagementId = c.EducationManagementId 
    group by 
     e.ManagementId, e.ManagmentTitle, StudentId 
) 
SELECT MAX(Parents), MAX(SocietyMembers), ManagementId, StudentId 
FROM CTE1 
GROUP BY ManagementId, StudentId 
+0

Es gibt keine studentID in CTE1 Ergebnisse gibt es? Würde die Abfrage gegen CTE1 nicht fehlschlagen? – xQbert

+0

entfernen Sie einfach StudentId aus der Auswahl und groupBy es wird gut funktionieren –

2

können Sie wie unten abfragen:

select 
    Sum(case when u.roleId = 10 then 1 else 0 end) as Parents, 
    Sum(case when u.roleId = 11 then 1 else 0 end) as SocietyMembers, 
    e.ManagementId, e.ManagmentTitle 
from 
    CentersRegistrationsApprovals r --ON r.StudentId = u.UserId 
inner join 
    Centers c ON c.CenterId = r.CenterId 
inner join 
    Managments e ON e.ManagementId = c.EducationManagementId 
Join Users u ON r.StudentId = u.UserId 
group by 
    e.ManagementId, e.ManagmentTitle 
+0

Ihre Lösung funktioniert, aber ich werde es trotzdem gründlich testen –

Verwandte Themen