我如何使用枢轴?

时间:2009-12-11 21:39:59

标签: sql sql-server sql-server-2005

我正在尝试使用表格上的数据旋转(转置)表格,但我不知道如何做到这一点。

我想知道它是如何运作的。 我找到了许多自我,但我无法理解这些是如何工作的。

Check this, e.g.

如何工作,我只想将我的行转换为cols和cols成行 假设我在第1天第2天有31个col,依此类推,直到第31天和一个外键EmpId 现在我想转动第1天2天

EmpId Day1 Day2 Day3
----------
1       A   P     P
2       P   P     p

这里我想像这样旋转表

Exp   1  2  3 as EmpId
----------
Day1  A  P  ....
Day2  P  P  ...
Day3  P  P  ...

等等

1 个答案:

答案 0 :(得分:2)

我检查了你的技术帖子here,我发现你不想使用PIVOT,因为它只返回聚合结果。 UNPIVOT会让你非常接近你正在寻找的东西,然后只需在桌子上为每一列做一个连接。我用下面给出的数据做了一个例子:

----Create the table and insert values as portrayed in the previous example.
CREATE TABLE pvt (EmpId int, Day1 char(1), Day2 char(1), Day3 char(1));
CREATE TABLE pvt2 (EmpId int, DayNum CHAR(4), DayNums CHAR(4));
GO
INSERT INTO pvt VALUES (1,'A','P','P');
INSERT INTO pvt VALUES (2,'P','P','P');
GO
--Unpivot the table.
INSERT INTO pvt2
SELECT EmpId,DayNum, DayNums
FROM 
   (SELECT EmpId, Day1, Day2, Day3
   FROM pvt) p
UNPIVOT
   (DayNums FOR DayNum IN 
      (Day1,Day2,Day3)
)AS unpvt;
GO
SELECT
 a.DayNum,
 a.DayNums,
    b.DayNums
FROM pvt2 a
 JOIN pvt2 b ON a.DayNum = b.DayNum
  AND a.EmpId=1
  AND b.EmpId = 2

运行上面的代码将返回:

Exp   1  2  3 as EmpId
----------
Day1  A  P  ....
Day2  P  P  ...
Day3  P  P  ...

我所知道的唯一其他解决方案是动态SQL,而且速度较慢且存在危险。但是,如果您正在运行一次也可以运行的代码。