Sql server 如何在sql查询中将多列设置为行

Sql server 如何在sql查询中将多列设置为行,sql-server,pivot,unpivot,Sql Server,Pivot,Unpivot,我想使用SQL Server将列转换为行。我已经尝试过unpivot,但是没有足够的知识使它只能成为一列 SELECT Unit,Excess_Reactivity ,Refuelling_required,MBP,MCP ,CPPF,Date FROM yourTable // select statement //insert to check data INSERT INTO yourTable (Unit,Excess_Reactivity ,Refuelling_requi

我想使用SQL Server将列转换为行。我已经尝试过unpivot,但是没有足够的知识使它只能成为一列

SELECT Unit,Excess_Reactivity ,Refuelling_required,MBP,MCP ,CPPF,Date FROM yourTable // select statement

//insert  to check data
INSERT INTO yourTable
    (Unit,Excess_Reactivity ,Refuelling_required,MBP ,MCP ,CPPF ,Date)
VALUES
    ('TAP-4','52','test1','12','96','35','2019-06-11 00:00:00.000')

INSERT INTO yourTable
    (Unit,Excess_Reactivity ,Refuelling_required,MBP ,MCP ,CPPF ,Date)
VALUES
    ('TAP-2','52','test1','12','96','35','2019-06-11 00:00:00.000')

INSERT INTO yourTable
    (Unit,Excess_Reactivity ,Refuelling_required,MBP ,MCP ,CPPF ,Date)
VALUES
    ('TAP-3','52','test1','12','96','35','2019-06-11 00:00:00.000')
这是一张桌子

+--------+--------+---------+-----+-----+------+------------+
|  UNit  | excess | refuell | MBp | MCP | CPPF |    DATE    |
+--------+--------+---------+-----+-----+------+------------+
| TAPS-4 |     52 | test1   |  12 |  96 |   35 | 11/06/2019 |
| TAPS-3 |     52 | test1   |  13 |  96 |   35 | 11/06/2019 |
| TAPS-2 |     52 | test1   |  42 |  96 |   35 | 11/06/2019 |
| TAPS-1 |     52 | test1   |  18 |  96 |   35 | 11/06/2019 |
+--------+--------+---------+-----+-----+------+------------+
我希望如下所示:

Values   TAPS-4  TAPS-3  TAPS-2 TAPS-1
--------------------------------------
excess    52      52     52      52
MBp       12      13     42      18
MCP       96      96     96      96
CPPF      35      35     35      35
  • 首先,您需要取消激活表,请注意,您需要将数据转换为相同的类型,因为每个数据都将转到同一列
  • 然后你可以转向你想要的结果
  • 如果需要,将其转换回原始数据类型

WITH unpvt as (
  SELECT Unit, Attribute, Vals
  FROM ( SELECT Unit, 
                cast(excess as nvarchar(100)) as excess, 
                cast(MBp as nvarchar(100)) as MBp, 
                cast(MCP as nvarchar(100)) as MCP,  
                cast(CPPF as nvarchar(100)) as CPPF
         FROM Table1) as p
  UNPIVOT
       (Vals FOR Attribute in (excess, MBp, MCP, CPPF)
       ) as unpvt
)
SELECT Attribute, [TAPS-4],  [TAPS-3], [TAPS-2], [TAPS-1]
FROM ( SELECT Unit, Attribute, Vals
       FROM unpvt) p 
PIVOT (
         MAX(Vals) FOR  Unit IN 
         ([TAPS-4], [TAPS-3], [TAPS-2], [TAPS-1])
      ) pvt
输出

| Attribute | TAPS-4 | TAPS-3 | TAPS-2 | TAPS-1 |
|-----------|--------|--------|--------|--------|
|      CPPF |     35 |     35 |     35 |     35 |
|    excess |     52 |     52 |     52 |     52 |
|       MBp |     12 |     13 |     42 |     18 |
|       MCP |     96 |     96 |     96 |     96 |

注意:在sql FIDLE中尝试
从unpvt
中选择*以查看中间结果。

您需要动态透视还是知道您的
?为什么要撤消我的格式?是的,需要动态,它收集名称并设置为列,多列数据将设置为行Juan Carlos Oropeza sry添加第一次在stackoverflow中需要很快解决这些问题我不知道您更改的格式您可以再次更改SRI恢复到我的版本您可以立即添加更改Yupz非常感谢我所希望的方式,而且,我可以通过调用其中的函数动态地带来taps-4、taps-3、taps-2值吗?