SQL Server:展开行和转置列

时间:2017-09-19 23:06:16

标签: sql sql-server

要绘制图片,这是我当前的表格:

Name    Size1    Size2    Size3    Size4
-----------------------------------------
Test    100      200      0        10
Test 2  50       0        100      50
Test 3  70       100      60       40

这是一张过时的表格,非常难以切片和切块。我想要做的是,根据尺寸大小调换大小列并展开行。

例如:

Name    Size    Values
----------------------
Test    1       100
Test    2       200
Test    4        10
Test 2  1        50
Test 2  3       100
Test 2  4        50
Test 3  1        70
Test 3  2       100
Test 3  3        60
Test 3  4        40

我的问题:这是可能的,还是我在做梦?

把我的头搔到秃顶......会欣赏任何见解!

干杯

2 个答案:

答案 0 :(得分:3)

使用cross apply (values ())取消对数据的取消投放:

select t.Name, v.Size, v.Value
from t
  cross apply (values 
    (1,Size1),(2,Size2),(3,Size3),(4,Size4)
    ) v (Size, Value)
where v.Value<>0

rextester演示:http://rextester.com/PPLRR33530

返回:

+--------+------+-------+
|  Name  | Size | Value |
+--------+------+-------+
| Test   |    1 |   100 |
| Test   |    2 |   200 |
| Test   |    4 |    10 |
| Test 2 |    1 |    50 |
| Test 2 |    3 |   100 |
| Test 2 |    4 |    50 |
| Test 3 |    1 |    70 |
| Test 3 |    2 |   100 |
| Test 3 |    3 |    60 |
| Test 3 |    4 |    40 |
+--------+------+-------+

答案 1 :(得分:0)

是的,你可以。 您需要UNPIVOT

这是一个例子:

--Create the table and insert values as portrayed in the previous example.
DECLARE @pvt TABLE 
(VendorID int, Emp1 int, Emp2 int,
    Emp3 int, Emp4 int, Emp5 int);

INSERT INTO @pvt VALUES (1,4,3,5,4,4);
INSERT INTO @pvt VALUES (2,4,1,5,5,5);
INSERT INTO @pvt VALUES (3,4,3,5,4,4);
INSERT INTO @pvt VALUES (4,4,2,5,5,4);
INSERT INTO @pvt VALUES (5,5,1,5,5,5);

--Unpivot the table.
SELECT VendorID, Employee, Orders
FROM 
   (SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
   FROM @pvt) p
UNPIVOT
   (Orders FOR Employee IN 
      (Emp1, Emp2, Emp3, Emp4, Emp5)
)AS unpvt;