2013-03-12 4 views
3

J'ai une table tblPersonaldata et tblStudentsadmittedGroupe par ne montre pas toutes les lignes

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 

Maintenant, je veux que les données comme ceci:

Gender Stage1 Stage2 
M  2  1 

Mais dans ce cas, je n'obtenir les données pour sexe féminin. Je veux que les données pour le genre féminin, même si elle est nulle

J'ai essayé:

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

Vos tables d'échantillons contiennent-elles toutes les informations dont vous disposez? Comme vous n'avez pas de données féminines là-bas? – CathalMF

Répondre

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 

SORTIE

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

+1 très belle syntaxe (semble vraiment Standard) – whytheq

+0

@JW je reçois une erreur près de Groupe en disant "Syntaxe incorrecte" – user1274646

+0

@ user1274646 cela vous dérangerait si vous postez votre requête? peut-être que vous avez manqué quelque chose, –

2

Dans SQL Server, vous pouvez utiliser la fonction PIVOT pour générer le résultat:

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 

Voir SQL Fiddle with Demo.

Puisque vous utilisez SQL Server 2008, cette requête utilise la VALUES pour générer la liste des genres que vous voulez dans le résultat final mis

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

Ensuite, en utilisant un LEFT JOIN sur les autres tables le résultat final renvoie une ligne pour les valeurs M et F.

Cela peut aussi être écrit en utilisant un UNION ALL pour générer la liste des genres:

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 

Voir SQL Fiddle with Demo

Le résultat des deux est:

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

Cela fonctionne aussi. En utilisant Left joins avec une nouvelle table (une table avec deux enregistrements pour les genres 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

GENRE SELECT, 0 AS 'STAGE 0', 1 AS 'ETAPE 1', 2 'AS Etape 2'
à partir de ( SELECT P.ID, le sexe, CAS QUAND STAGE EST NULL ALORS 0 AUTRE STAGE STAGE DE FIN DE tblPersonaldata P LEFT JOIN tblStudentsadmitted S = ON P.UID S.UID ) COMME PIVOT ( COUNT (ID) POUR STAGE EN ([0], [ 1],[ 2])

Questions connexes