2013-03-12 63 views
3

我有一個表tblPersonaldatatblStudentsadmitted集團通過不顯示所有行

tblPersonalData 

UID Name Gender 
------------------------ 
E1 xyz M 
E2 pqr M 
E3 mno M 

tblStudentsadmitted 

UID Status Stage 
---------------------- 
E1  Y  1 
E2  Y  2 
E3  Y  1 

現在我想是這樣的數據:

Gender Stage1 Stage2 
M  2  1 

但在這種情況下,我沒有得到的數據女性性別。我想對女性性別的數據,即使它是空

我已經試過這樣:

select 
    case 
     when gender='M' then 'Male' 
     when gender='F' then 'Female' 
    end as Gender, 
    sum(case when Stage=1 then 1 else 0) end as Stage1, 
    sum(case when Stage=2 then 1 else 0) end as Stage2 
from tblPersonaldata A inner join 
     tblStudentsadmitted B on A.UID=B.UID 
where B.Status='Y' 
group by Gender 
+0

您的樣本表是否包含所有的信息? 因爲你沒有任何女性數據? – CathalMF 2013-03-12 11:41:03

回答

3

SELECT CASE WHEN a.Gender = 'M' THEN 'Male' ELSE 'FEMALE' END Gender, 
     SUM(CASE WHEN Stage = 1 THEN 1 ELSE 0 END) Stage1, 
     SUM(CASE WHEN Stage = 2 THEN 1 ELSE 0 END) Stage2 
FROM personal a 
     LEFT JOIN studentadmitted b 
      ON a.UID = b.UID AND b.Status = 'Y' 
GROUP BY a.Gender 

SELECT CASE WHEN c.Gender = 'M' THEN 'Male' ELSE 'Female' END Gender, 
     SUM(CASE WHEN Stage = 1 THEN 1 ELSE 0 END) Stage1, 
     SUM(CASE WHEN Stage = 2 THEN 1 ELSE 0 END) Stage2 
FROM (SELECT 'F' Gender UNION SELECT 'M' Gender) c 
     LEFT JOIN personal a 
      ON a.Gender = c.Gender 
     LEFT JOIN studentadmitted b 
      ON a.UID = b.UID AND b.Status = 'Y' 
GROUP BY c.Gender 

輸出

╔════════╦════════╦════════╗ 
║ GENDER ║ STAGE1 ║ STAGE2 ║ 
╠════════╬════════╬════════╣ 
║ Female ║  0 ║  0 ║ 
║ Male ║  2 ║  1 ║ 
╚════════╩════════╩════════╝ 
+0

+1非常好的語法(看起來很標準) – whytheq 2013-03-12 12:00:31

+0

@JW我在組附近出現錯誤,提示「Incorrect Syntax」 – user1274646 2013-03-12 12:09:11

+0

@ user1274646如果您發佈您的查詢,您會介意嗎?或許你錯過了什麼, – 2013-03-12 12:09:49

2

在SQL Server中,你可以使用PIVOT函數生成的結果:

select gender, 
    Stage1, 
    Stage2 
from 
(
    select 
    c.gender, 
    'Stage'+cast(stage as varchar(10)) Stage 
    from (values ('F'),('M')) c (gender) 
    left join tblpersonaldata p 
    on c.gender = p.gender 
    left join tblStudentsadmitted s 
    on p.uid = s.uid 
    and s.Status='Y' 
)src 
pivot 
(
    count(stage) 
    for stage in (Stage1, Stage2) 
) piv 

SQL Fiddle with Demo

由於您使用的是SQL Server 2008的這個查詢使用VALUES通過其他表使用LEFT JOIN最終的結果產生你在最終結果中想要的性別的設置列表

from (values ('F'),('M')) c (gender) 

然後將爲MF值返回一行。

這也可以使用UNION ALL產生性別的名單寫:

select gender, 
    Stage1, 
    Stage2 
from 
(
    select 
    c.gender, 
    'Stage'+cast(stage as varchar(10)) Stage 
    from 
    (
    select 'F' gender union all 
    select 'M' gender 
) c 
    left join tblpersonaldata p 
    on c.gender = p.gender 
    left join tblStudentsadmitted s 
    on p.uid = s.uid 
    and s.Status='Y' 
)src 
pivot 
(
    count(stage) 
    for stage in (Stage1, Stage2) 
) piv 

SQL Fiddle with Demo

共同作用的結果是:

| GENDER | STAGE1 | STAGE2 | 
---------------------------- 
|  F |  0 |  0 | 
|  M |  2 |  1 | 
1

這也是工作。使用Left joins與新表(表中有兩個性別記錄M & F)。

Fiddle demo

select t.g Gender, 
     isnull(sum(case when Stage = 1 then 1 end),0) Stage1, 
     isnull(sum(case when Stage = 2 then 1 end),0) Stage2 
from (values ('M'),('F')) t(g) 
      left join personal a on t.g = a.gender 
      left join studentadmitted b on a.uid = b.uid and b.Status = 'Y' 
group by t.g 
order by t.g 

| GENDER | STAGE1 | STAGE2 | 
---------------------------- 
|  F |  0 |  0 | 
|  M |  2 |  1 | 
0

SELECT性別,0 AS 'STAGE 0',1 AS 'STAGE 1',2 AS 'STAGE 2'
FROM ( SELECT P.ID,性別, CASE WHEN STAGE IS NULL THEN ELSE 0 END STAGE STAGE FROM tblPersonaldata P LEFT JOIN tblStudentsadmitted S ON P.UID = S.UID ),爲 PIVOT ( COUNT(ID)FOR階段([0],[ 1],[ 2]) )P