将 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
我需要:
- 将 action_type 转换为 COLUMN 值
- 如果 action_type 不为空则表示为“1”,如果为空则表示为 0。
- 确保排除重复项,因为它们存在于源文件中 table
- 静态 PIVOT 没问题,因为 ACTION_tYPE 值的数量有限
期望的结果:
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
在 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
我需要:
- 将 action_type 转换为 COLUMN 值
- 如果 action_type 不为空则表示为“1”,如果为空则表示为 0。
- 确保排除重复项,因为它们存在于源文件中 table
- 静态 PIVOT 没问题,因为 ACTION_tYPE 值的数量有限
期望的结果:
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:
超过 1SELECT 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