2013-03-07 2 views
5

Я не могу решить этот вопрос.Sql Query: не удалось сгруппировать данные из разных таблиц

Таблицы:

tblStandard1students 
tblStandard2students 
tblStandard3students  
tblCandidateinfo 

tblStandard1students, tblStandard2students и tblStandard3students TBL содержат информацию о студентах, обучающихся в стандартном 1,2 и 3.

tblStandars1students

Candid admitted 
    1  Y 
    2  N 
    3  Y 


tblCandidateinfo 

Candid gender Division 
    1  M  1 
    2  F  2 

и так далее ..

Теперь я хочу, чтобы стол как это

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

Я попытался это, но это не дает мне ошибку:

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

Я не вижу ни сообщение об ошибке отправил или 'ORDER BY' используется. Вы имеете в виду «GROUP» вместо «SORT»? – 2013-03-07 07:07:50

+0

@pst извините! отредактировал вопрос. – user1274646

ответ

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

Я получаю сообщение об ошибке «Неоднозначное название столбца« std1 ».» – user1274646

+0

Я исправил запрос – valex

+0

, спасибо, что это сработало! – user1274646

0

В этом случае также можно использовать PIVOT операции

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 on SQLFiddle

1

Этот синтаксис запроса работает с Oracle. В принципе, я использовал правое внешнее соединение.

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

Спасибо, что ты тоже работал .. и просто, чтобы понять – user1274646

Смежные вопросы