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

しかし、この場合、女性の性別のデータは取得できません。nullでも女性のデータが欲しい

私はこれを試しました:

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
4

4 に答える 4

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 ║
╚════════╩════════╩════════╝
于 2013-03-12T11:39:19.677 に答える
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 FiddlewithDemoを参照してください。

SQL Server 2008を使用しているため、このクエリはを使用してVALUES、最終結果セットに必要な性別のリストを生成します。

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

次にLEFT JOIN、他のテーブルでaを使用すると、最終結果はとの両方の値の行を返しMますF

これは、を使用して記述し、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 FiddlewithDemoを参照してください

両方の結果は次のとおりです。

| GENDER | STAGE1 | STAGE2 |
----------------------------
|      F |      0 |      0 |
|      M |      2 |      1 |
于 2013-03-12T11:47:22.613 に答える
1

これも機能しています。Left joins新しいテーブル (性別&の 2 つのレコードを持つMFテーブル) で使用します。

フィドルのデモ

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 |
于 2013-03-12T11:55:28.453 に答える
0

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

于 2013-03-12T12:15:34.650 に答える