Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 多列上的透视/取消Pivot表_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 多列上的透视/取消Pivot表

Sql 多列上的透视/取消Pivot表,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要转换以下数据: EmployeeId DataCategory DataValue StartDate ---------- ------------ ---------- ---------- 2 'OfficeCode' 121 '03-01-12' 2 'ManagerName' 'Steven' '02-04-12' 2

我需要转换以下数据:

EmployeeId     DataCategory     DataValue     StartDate   
----------     ------------     ----------   ---------- 
    2          'OfficeCode'         121        '03-01-12'
    2          'ManagerName'      'Steven'     '02-04-12'
    2          'State'              'MA'       '04-05-12'
    5          'OfficeCode'         133        '04-01-12'
    5          'ManagerName'      'Marcus'     '05-04-12'
    5          'State'              'WA'       '01-05-12'
    6          'ManagerName'      'Steven'     '07-04-12'
    6          'State'              'RI'       '06-05-12'
    7          'State'              'CA'       '08-08-12'
致:

我可以这样做:

select EmployeeId, OfficeCode, ManagerName, State
from
(
  select EmployeeId, DataCategory, DataValue
  from emp
) src
pivot
(
  max(DataValue)
  for DataCategory in (OfficeCode, ManagerName, State)
) piv

但是,我还需要DataCategory OfficeCode的开始日期(忽略任何其他类别的开始日期)。您能帮助我使用pivot/unpivot实现期望的结果吗?除非必要,否则我试图避免连接/联合。

三种方法:一种是带联合的,一种是带连接的,一种是不带枢轴的。选择你最喜欢的一个(根据查询计划,最后一个是最快的)

select EmployeeId, OfficeCode, ManagerName, State
from
(
  select EmployeeId, DataCategory, DataValue
  from emp
) src
pivot
(
  max(DataValue)
  for DataCategory in (OfficeCode, ManagerName, State)
) piv
/*
CREATE TABLE emp (
    EmployeeId INT,
    DataCategory VARCHAR(50),
    PRIMARY KEY (EmployeeID, DataCategory),
    DataValue VARCHAR(50) NOT NULL,
    StartDate VARCHAR(10) NOT NULL
)

INSERT INTO emp VALUES
('2','OfficeCode','121','03-01-12'),
('2','ManagerName','Steven','02-04-12'),
('2','State','MA','04-05-12'),
('5','OfficeCode','133','04-01-12'),
('5','ManagerName','Marcus','05-04-12'),
('5','State','WA','01-05-12'),
('6','ManagerName','Steven','07-04-12'),
('6','State','RI','06-05-12'),
('7','State','CA','08-08-12')
*/

select EmployeeId, OfficeCode, ManagerName, State, OfficeCodeStartDate
from
(
  select EmployeeId, DataCategory, DataValue
  from emp
  union all
  select EmployeeId, 'OfficeCodeStartDate' AS DataCategory, StartDate AS DataValue
  from emp
  WHERE DataCategory='OfficeCode'
) src
pivot
(
  max(DataValue)
  for DataCategory in (OfficeCode, ManagerName, State, OfficeCodeStartDate)
) piv

select piv.EmployeeId, OfficeCode, ManagerName, State, emp.StartDate AS OfficeCodeStartDate
from
(
  select EmployeeId, DataCategory, DataValue
  from emp
) src
pivot
(
  max(DataValue)
  for DataCategory in (OfficeCode, ManagerName, State)
) piv
LEFT JOIN emp ON emp.EmployeeId=piv.EmployeeId AND emp.DataCategory='OfficeCode'

SELECT EmployeeId,
    MIN(CASE WHEN DataCategory='OfficeCode' THEN DataValue END) AS OfficeCode,
    MIN(CASE WHEN DataCategory='ManagerName' THEN DataValue END) AS ManagerName,
    MIN(CASE WHEN DataCategory='State' THEN DataValue END) AS State,
    MIN(CASE WHEN DataCategory='OfficeCode' THEN StartDate END) AS OfficeCodeStartDate
FROM emp
GROUP BY EmployeeId