2013-03-07 15 views
5

Nie mogę rozwiązać tego zapytania.Kwerenda sql: Nie można grupować danych z różnych tabel

Tabele są:

tblStandard1students 
tblStandard2students 
tblStandard3students  
tblCandidateinfo 

tblStandard1students, tblStandard2students i tblStandard3students tbl zawierają informacje o studentów w standardzie 1,2 i 3.

tblStandars1students

Candid admitted 
    1  Y 
    2  N 
    3  Y 


tblCandidateinfo 

Candid gender Division 
    1  M  1 
    2  F  2 

i tak dalej .. ..

Teraz chcę tabeli jak to

Gender Students(Standard1) Students(Standard2) Students(Standard3) 
------------------------------------------------------------------------ 
Male   10     20      30  
Female   10     30      40 

próbowałem tego, ale to nie daje mi błąd:

SELECT case when Gender='M' then 'Male' 
      when Gender='F' then 'Female' 
     END AS Gender, 

(SELECT count(*) 
FROM tblStandard1students A 
where A.Candid=B.Candid 
) AS Students(Standard1), 

(SELECT count(*) 
FROM tblStandard2students A 
    where A.Candid=B.Candid 
) AS Students(Standard2), 

(SELECT count(*) 
FROM tblStandard3students A 
    where A.Candid=B.Candid 
) AS Students(Standard3) 


FROM tblCandidateinfo B 
group by Gender 
+0

nie widzę albo komunikat o błędzie pisał lub 'ZAMÓWIENIE BY' używany. Masz na myśli "GROUP" zamiast "SORTUJ"? –

+0

@pst sorry! zredagowane pytanie. – user1274646

Odpowiedz

1

SQLFiddle demo

select 
case when Gender='M' then 'Male' 
      when Gender='F' then 'Female' 
     END AS Gender, 
sum(T.std1) as [Students(Standard1)], 
sum(T.std2) as [Students(Standard2)], 
sum(T.std3) as [Students(Standard3)] 
from 
tblCandidateinfo as C 

JOIN 
(
select Candid, 1 as std1, 0 as std2, 0 as std3 
from tblStandars1students 
union all 
select Candid, 0 as std1, 1 as std2, 0 as std3 
from tblStandars2students 
union all 
select Candid, 0 as std1, 0 as std2, 1 as std3 
from tblStandars3students 
) as T on (C.Candid=T.Candid) 

GROUP BY GENDER 
+0

Otrzymuję błąd jako "Niejednoznaczna nazwa kolumny" std1 "." – user1274646

+0

Naprawiłem zapytanie – valex

+0

, dzięki temu zadziałało! – user1274646

0

W tym przypadku również można użyć PIVOT operację

SELECT CASE WHEN Gender='M' then 'Male' 
      WHEN Gender='F' then 'Female' 
     END AS Gender, [Students(Standard1)], [Students(Standard2)], [Students(Standard3)] 
FROM (
     SELECT (SELECT gender FROM tblCandidateinfo i WHERE x.Candid = i.Candid) AS gender, List 
     FROM (
      SELECT Candid, 'Students(Standard1)' AS List 
      FROM dbo.tblStandard1students 
      UNION ALL 
      SELECT Candid, 'Students(Standard2)' 
      FROM dbo.tblStandard2students 
      UNION ALL 
      SELECT Candid, 'Students(Standard3)' 
      FROM dbo.tblStandard3students 
      ) x 
    ) x2 
PIVOT 
(
    COUNT(List) FOR List IN ([Students(Standard1)], [Students(Standard2)], [Students(Standard3)]) 
) p 

Demo pod adresem SQLFiddle

1

Ta składnia zapytania działa w Oracle. Zasadniczo użyłem prawego połączenia zewnętrznego.

select case when Gender='M' then 'Male' 
      when Gender='F' then 'Female' END AS Gender, 
     count(A.candid) AS "Students(Standard1)", 
     сount(A1.candid) AS "Students(Standard2)", 
     сount(A2.candid) AS "Students(Standard3)" 
from tblStandard1students A, 
    tblStandard2students A1, 
    tblStandard3students A2, 
    tblCandidateinfo B 
where A.candid(+)=B.candid and A1.candid(+)=B.candid and A2.candid(+)=B.candid 
group by gender 
+0

Dziękuję, że twoje też działało ... i proste do zrozumienia – user1274646

Powiązane problemy