首页 > 解决方案 > 如何将行转换为分组数据的列?

问题描述

在进行员工和主管分析时,我遇到了 BigQuery 语句的问题。

SELECT SupervisorName, Emp_Status, COUNT(DISTINCT EmpNO)AS NUMBER
FROM 
(SELECT
  EmpNO,
  EmpName,
  (CASE WHEN TerminationDate IS NULL THEN 'Active'
    ELSE 'Terminated'
  END
    )AS Emp_Status, 
    DateOfBirth,
    DATE_DIFF(CURRENT_DATE(),DateOfBirth,YEAR) AS Age,
    SupervisorName

    FROM `Table1`
)
GROUP BY SupervisorName, Emp_Status
ORDER BY SupervisorName, NUMBER DESC

结果如下所示:

    Row SupervisorName  Emp_Status  NUMBER  
1   null            Terminated       321
2   null            Active           2
3   Ahearn          Active           3
4   Ahearn          Terminated       2
5   Allen           Active           6
6   Allen           Terminated       3
......

我怎样才能把它改成这样:

    Row SupervisorName  Active    Termination   Total
    1       Null            2          321           323
    2       Ahearn          3          2             5 
    3       Allen           6          3             9
......

标签: sqlgoogle-bigquery

解决方案


这里的标准模式是使用 SUM 和 CASE 来获得结果——如下:

SELECT 
  SupervisorName, 
  SUM(CASE WHEN Emp_Status = 'Active' THEN 1 ELSE 0 END) AS Active,
  SUM(CASE WHEN Emp_Status = 'Terminated' THEN 1 ELSE 0 END) AS Termination,
  COUNT(*) AS Total
FROM (
  SELECT
    EmpNO,
    EmpName,
    CASE WHEN TerminationDate IS NULL THEN 'Active' ELSE 'Terminated' END AS Emp_Status, 
    DateOfBirth,
    DATE_DIFF(CURRENT_DATE(),DateOfBirth,YEAR) AS Age,
    SupervisorName
  FROM `Table1`
)
GROUP BY SupervisorName 

请注意,我留下了与您相同的子查询,但鉴于您实际上不需要子查询,您只需更改 CASE 语句以查看终止日期而不是您在子查询中创建的字符串。

我假设您的实际代码更复杂,所以我就这样离开了。


推荐阅读