将 SQL 服务器中的文本值旋转为 1 和 0

Pivoting Text Values in SQL Server as 1 & 0

在 MS SQL Server 2014 中,我有以下 EMPLOYEE table 跟踪员工行为,例如雇用、离职、重新雇用等:

EMPID   EMPNAME     ACTION_DATE ACTION_TYPE
1234    JOHN SMITH  2021-05-01  HIRED
1234    JOHN SMITH  2021-05-01  HIRED
1234    JOHN SMITH  2021-07-31  TERMINATED
1236    JANE SMITH  2021-06-01  HIRED
1236    JANE SMITH  2021-06-15  TERMINATED
1236    JANE SMITH  2021-07-31  REHIRED

我需要:

期望的结果:

EMPID   EMPNAME     ACTION_DATE HIRED    TERMINATED    REHIRED
1234    JOHN SMITH  2021-05-01  1        1             0
1236    JANE SMITH  2021-06-15  1        1             1 

我卡在这上面了。这是一个示例数据集,代码我已经 built/tried。 有什么建议么?谢谢!

WITH EMPLOYEES(EMPID, EMPNAME, ACTION_DATE,  ACTION_TYPE )AS
(
   SELECT 1234,  'JOHN SMITH', '2021-05-01', 'HIRED' UNION ALL
   SELECT 1234,  'JOHN SMITH'  , '2021-05-01', 'HIRED' UNION ALL
   SELECT 1234,  'JOHN SMITH' ,'2021-07-31', 'TERMINATED' UNION ALL   
   SELECT 1236,  'JANE SMITH', '2021-06-01', 'HIRED' UNION ALL
   SELECT 1236,  'JANE SMITH'  ,'2021-06-15', 'TERMINATED' UNION ALL
   SELECT 1236,  'JANE SMITH' ,'2021-07-31', 'REHIRED' 
) 


   select *   from EMPLOYEES 
   PIVOT (MAX(ACTION_TYPE) 
   FOR ACTION_TYPE IN ([HIRED],[TERMINATED],[REHIRED])) AS P1 

您可以使用已有的,并为每个透视列做一个 case 语句,或者您可以使用 count 作为聚合函数并确保结果不会使用 distinct:

超过 1
SELECT EMPID, EMPNAME, ACTION_DATE, HIRED, TERMINATED, REHIRED 
-- Make sure each row is distinct:
FROM (SELECT DISTINCT EMPID, EMPNAME, ACTION_DATE, ACTION_TYPE FROM EMPLOYEES) emps 
PIVOT (COUNT(ACTION_TYPE) -- At most there can be one row so count can only be 0 or 1.
  FOR ACTION_TYPE IN ([HIRED],[TERMINATED],[REHIRED])) AS P1 

我不太确定你想用它做什么 ACTION_DATE,因为在你的示例中你似乎将所有内容合并到一行中。在下面的示例中,我只使用 MIN,它与您的目标不太匹配,但应该足以实现您想要的目标:

SELECT EMPID, EMPNAME, MIN(ACTION_DATE), SUM(HIRED), SUM(TERMINATED), SUM(REHIRED)
FROM (SELECT DISTINCT * FROM EMPLOYEES) emps
PIVOT (COUNT(ACTION_TYPE) 
  FOR ACTION_TYPE IN ([HIRED],[TERMINATED],[REHIRED])) AS P1 
GROUP BY EMPID, EMPNAME