5

我无法解决此查询。

表格是:

tblStandard1students
tblStandard2students
tblStandard3students     
tblCandidateinfo

tblStandard1students、tblStandard2students 和 tblStandard3students tbl 包含有关参加标准 1,2 和 3 的学生的信息。

tblStandrs1students

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
4

3 回答 3

1

SQLFiddle 演示

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
于 2013-03-07T07:21:21.970 回答
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
于 2013-03-07T09:28:21.840 回答
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

SQLFiddle上的演示

于 2013-03-07T08:17:03.190 回答