2013-03-05 39 views
1

嗨,我需要写一个查询的帮助。Sql查询从不同的表中找出总和

表是:

tblStandard1students 
tblStandard2students 
tblStandard1students 
tblDivision 
tblCandidateinfo 

tblStandard1students,tblStandard2students,tblStandard1studentstbl含有约参加标准1,2和3

tblStandars1students

Candid admitted 
    1  Y 
    2  N 
    3  Y 

tblDivision学生信息仅包含2列

ID  Division 
    1  A 
    2  B 
    3  C 

tblCandidateinfo

Candid gender Division 
    1  M  1 
    2  F  2 

等等...

现在我想这样

Division Students(Standard1) Students(Standard2) Students(Standard3) 
      M   F   M   F  M   F 
------------------------------------------------------------------------ 
A   1   0   0   0   0   1 
B   2   2   3   3   4   4 
C   1   0   0   0   0   0 

表我尝试这样做下面的查询:

SELECT Division, 

    (SELECT count(*) 
    FROM tblStandard1students A 
    INNER JOIN tblCandidateinfo B ON A.Candid=B.Candid 
    INNER JOIN tblDivision C ON C.ID=B.Division) AS Students(Standard1), 

    (SELECT count(*) 
    FROM tblStandard2students A 
    INNER JOIN tblCandidateinfo B ON A.Candid=B.Candid 
    INNER JOIN tblDivision C ON C.ID=B.Division) AS Students(Standard2), 

    (SELECT count(*) 
    FROM tblStandard3students A 
    INNER JOIN tblCandidateinfo B ON A.Candid=B.Candid 
    INNER JOIN tblDivision C ON C.ID=B.Division) AS Students(Standard3) 
FROM tblDivision Z 

但这只是我的查询的一半将性别分开......帮助我完成它。

回答

2
;WITH combined AS 
(
    SELECT ci.Division, 'Students(Standard1) ' + ci.gender AS grp 
    FROM tblCandidateInfo ci 
    INNER JOIN tblStandard1students s ON ci.Candid = s.Candid 
    UNION ALL 
    SELECT ci.Division, 'Students(Standard2) ' + ci.gender AS grp 
    FROM tblCandidateInfo ci 
    INNER JOIN tblStandard2students s ON ci.Candid = s.Candid 
    UNION ALL 
    SELECT ci.Division, 'Students(Standard3) ' + ci.gender AS grp 
    FROM tblCandidateInfo ci 
    INNER JOIN tblStandard1studentstbl s ON ci.Candid = s.Candid 
) 
SELECT Division, 
    [Students(Standard1) M], [Students(Standard1) F], 
    [Students(Standard2) M], [Students(Standard2) F], 
    [Students(Standard3) M], [Students(Standard3) F] 
FROM 
(
    SELECT d.Division, grp 
    FROM tblDivision d 
    LEFT OUTER JOIN combined c ON d.ID = c.Division 
) x 
PIVOT 
(
    COUNT(grp) 
    FOR grp IN ([Students(Standard1) M], [Students(Standard1) F], 
     [Students(Standard2) M], [Students(Standard2) F], 
     [Students(Standard3) M], [Students(Standard3) F]) 
) y 
ORDER BY Division 
0

SELECT divison.Division,IFNULL(stander1.M,0),IFNULL(stander1.F,0)FROM testtblDivision divison 左加入( 'M' 时,选择分割,计数(情况性别然后1个否则返回null端)为M,计数(情况性别当 'F' 则1否则返回null端)为F FROM testtblCandidateinfo TC内加入test.tblStandars1students TS1

ON tc.Candid = ts1.Candid

group by division) as stander1 on stander1.division= divison.id 

组由divison.id ;

IFNULL使用ISNULL的insted的和 采取左的连接为所有标准表