【问题标题】:How to set multiple columns into rows in sql query如何在sql查询中将多列设置为行
【发布时间】:2019-06-11 17:45:05
【问题描述】:

我想使用 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

【问题讨论】:

  • 您是否需要动态枢轴或者您知道您的VALUES
  • 为什么要撤消我的格式?
  • 是的,需要动态的,它收集名称并设置为列,多列数据将设置为行
  • Juan Carlos Oropeza sry 第一次在 stackoverflow 中添加需要这些来快速解决我不知道你改变的格式你可以再次改变它
  • 我恢复到我的版本你现在可以添加更改

标签: sql-server pivot unpivot


【解决方案1】:
  • 首先您需要取消透视表,注意您需要将数据转换为相同类型,因为每个数据都将转到同一列。
  • 然后你可以转向你想要的结果。
  • 如果需要将其转换回原始数据类型。

SQL FIDDLE

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 fiddle 中尝试SELECT * FROM unpvt 以查看中间结果。

【讨论】:

  • Yupz 非常感谢我想要的方式,另外,我可以通过调用其中的函数动态地带来 taps-4 、 taps-3 、 taps-2 值吗?
猜你喜欢
  • 2012-05-07
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多