复杂的pivot / unpivot操作

时间:2018-04-04 09:02:32

标签: sql sql-server pivot unpivot

我是一个新的转向/未转动&它的语法,我发现很难绕过它。我的问题非常复杂,至少对我而言。

案例:我有来自不同处理器的测试数据,其测试值的时间范围为200秒。

我的数据目前的结构如下:

TestName   |   Brand  |  Line   |  Model   | Time   |  Value  |
---------------------------------------------------------------
IntelTest1 |   Intel  |   i7    |   8700k  |  1     |   0.20  |
IntelTest1 |   Intel  |   i7    |   8700k  |  2     |   0.35  |
IntelTest1 |   Intel  |   i7    |   8700k  |  3     |   0.89  |
IntelTest1 |   ...    |  ...    |   ...    |  ...   |   ...   |
AmdTest1   |   AMD    | Ryzen 5 |   1600   |  1     |   0.12  |
AmdTest1   |   AMD    | Ryzen 5 |   1600   |  2     |   0.34  |
AmdTest1   |   AMD    | Ryzen 5 |   1600   |  3     |   0.51  |
AmdTest1   |   ...    |  ...    |   ...    |  ...   |   ...   |
...        |   ...    |  ...    |   ...    |  ...   |   ...   |

我需要将其转换为以下格式以用于报告目的:

RowNumber   |  Time  |  IntelTest1 |   AmdTest1  | ...
--------------------------------------------------
1           |        |  IntelTest1 |   AmdTest1  |  
2           |        |    Intel    |     AMD     | 
3           |        |     i7      |   Ryzen 5   | 
4           |        |    8700k    |    1600     |
5           |   1    |    0.20     |    0.12     |
6           |   2    |    0.35     |    0.34     |
7           |   3    |    0.89     |    0.51     |
8           |   4    |    ...      |    ...      |

简而言之,我首先需要每个Test的元数据(TestName,Brand,Line和Model),然后是每个时间点的值。列应该是每个testname。

我一直在尝试使用旋转功能(动态因为名称的数量是可变的)并且是不可忽略的但我无法弄清楚如何正确地构建它。

我需要多个操作才能完成此任务吗?

编辑:让这个例子更加清晰(希望如此)。

1 个答案:

答案 0 :(得分:0)

你不应该在SQL中做。但是,如果你真的必须尝试下面的查询

See live demo

create table sample (TestName varchar(100),Brand varchar(100), Line varchar(100), Model varchar(100), Time int, Value decimal(5,2))
insert into sample values
('IntelTest1','Intel','i7', '8700k',1, 0.20)
,('IntelTest1','Intel','i7', '8700k',2, 0.35)
,('IntelTest1','Intel','i7', '8700k',3, 0.89)
,('AmdTest1','AMD','Ryzen 5', '1600',1, 0.12)
,('AmdTest1','AMD','Ryzen 5', '1600',2, 0.34);

select
rownumber= row_number() over ( order by (select 1)), * 
from
(
select [Time]=Null ,[IntelTest1]=[1],
[Amdtest1]=[2]
from
(
    select 
     rownum=row_number() over(order by (select 1) ) , * 
    from
    (
      select 
         distinct 
         TestName, 
         Brand,
         Line,
         Model
      from sample
    )s
)s
unpivot
( data for keys in (TestName, Brand, Line, Model))up
pivot
( max(data) for rownum in ([1],[2]))p
union all
select Time,[IntelTest1]=Cast([IntelTest1] as varchar(max)),[AMDTest1]=cast([AMDTest1] as varchar(max)) from
(select  TestName,Time, Value  from sample)s
pivot
(max(value) for TestName in ([IntelTest1],[AMDTest1]))p
)t