【问题标题】:Group by does not show all the rowsGroup by 不显示所有行
【发布时间】:2013-03-12 11:37:11
【问题描述】:

我有一张桌子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

【问题讨论】:

  • 您的示例表是否包含您所拥有的所有信息?因为你那里没有女性数据?

标签: sql sql-server sql-server-2008 pivot


【解决方案1】:

罢工>

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 ║
╚════════╩════════╩════════╝

【讨论】:

  • @user1274646 您介意发布您的查询吗?也许你错过了什么,
  • @JW 是的,我知道了,查询正在运行,但我仍然没有得到女性行
  • 应该有,能发下查询吗? :D 看到这个小提琴,它工作正常吗? sqlfiddle.com/#!3/673c3/10
【解决方案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 来生成您希望在最终结果集中出现的性别列表

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

然后通过在其他表上使用LEFT JOIN,最终结果将为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 |

【讨论】:

    【解决方案3】:

    这也有效。将Left joins 与一个新表一起使用(一个包含两条性别记录的表MF)。

    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 |
    

    【讨论】:

      【解决方案4】:

      选择性别,0 作为“第 0 阶段”,1 作为“第 1 阶段”,2 作为“第 2 阶段”
      从 ( 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 ) 作为一个 枢 ( 计数(ID)的阶段([0],[1],[2]) )P

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-04
        • 2023-04-01
        • 1970-01-01
        • 2019-07-07
        • 1970-01-01
        • 2023-01-02
        • 2021-12-17
        • 2021-09-27
        相关资源
        最近更新 更多