【问题标题】:Manipulate results to display rows as columns处理结果以将行显示为列
【发布时间】:2012-10-25 21:11:51
【问题描述】:

我有两张桌子。 表A包含部门列表,共有20个。

看图

表 B 包含表 A 中的每个部门至少 1 行,其中一些包含一些。

看图

我想要的是从 A 和 B 创建的第三张表,它基本上列出了每个部门,然后是全职和兼职的人数。例如,如果在表 b 中找到一个部门,该部门只有全职或兼职的数字(例如部门 D),那么我希望表显示 0(零)而不是将其留空。

看图

任何人都可以就此提出建议吗?

编辑 如果其中一个部门没有例如“兼职”,这意味着他们的兼职员工人数通常为零。

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    你想要一个PIVOT

    select *
    from (tableb) s
    pivot (Max(staffno) for employee_class in ([Full Time],[Part Time])) p
    

    【讨论】:

    • 这行得通,你能解释一下我是如何合并全职和兼职的,还可以解释一下 p 最后在做什么吗?
    • 你的意思是“合并”全职和兼职? p 只是旋转的别名。
    • 参见 Itzik Ben-Gan 关于 Pivots 的优秀文章;他介绍了许多不同的数据透视方法。 sqlmag.com/article/sql-server/pivoting-data
    • @SelectDistinct select DeptName ,[FullTime] = COALESCE([FullTime],0),[PartTime] = COALESCE([PartTime],0) 来自....
    【解决方案2】:
    SELECT
      A.DEPTNAME,
      (SELECT COUNT(*) FROM TABLEA A2 INNER JOIN TABLEB B ON B.TableAID = A2.TableAID WHERE B.EMPLOYEE_CLASS = 'Full time' AND A2.TableAID = A.TableAID) FullTimeNo,
      (SELECT COUNT(*) FROM TABLEA A2 INNER JOIN TABLEB B ON B.TableAID = A2.TableAID WHERE B.EMPLOYEE_CLASS = 'Part time' AND A2.TableAID = A.TableAID) PartTimeNo
    FROM
      TABLEA
    

    【讨论】:

      【解决方案3】:

      试试这个:

      select A.DEPTNAME, 
             sum(case when B.EMPLOYEE_CLASS='Full time' then B.STAFF_NO else 0) as FullTimeNo,
             sum(case when B.EMPLOYEE_CLASS='Part time' then B.STAFF_NO else 0) as PartTimeNo,
      from TabA A
      join TabB B on A.DEPTNAME=B.DEPTNAME
      group by A.DEPTNAME
      

      【讨论】:

        猜你喜欢
        • 2011-05-08
        • 2020-07-05
        • 2014-02-20
        • 2020-09-14
        • 1970-01-01
        • 2014-06-23
        • 1970-01-01
        • 1970-01-01
        • 2016-07-21
        相关资源
        最近更新 更多