Sql Query从不同的表中查找总和

时间:2013-03-05 12:16:15

标签: sql sql-server-2008

您需要帮助撰写查询。

表格是:

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

SELECT divison.Division,IFNULL(stander1.M,0),IFNULL(stander1.F,0)FROM testtblDivision divison 左连接(SELECT除法,计数(情况性别为'M',然后1,否则为空结束)为M,计数(案例性别为'F',然后1为其他为空结束)为F 从     testtblCandidateinfo tc内联接test.tblStandars1students ts1

ON tc.Candid = ts1.Candid

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

group by divison.id ;

感染IFNULL使用ISNULL和 对所有标准表进行左连接