【问题标题】:SQL Pivot Column to RowsSQL 透视列到行
【发布时间】:2018-01-18 17:55:08
【问题描述】:

[从列到行的 SQL 透视图]

current data structure

大家好, 我正在尝试将表中的列转换为行以满足要求,我能够将多个列值带到一列,但不知道如何转置为行。 感谢您的帮助

WITH mn_result AS(
SELECT 
eh.[RUN_NUMBER], ed.[NOTCH_STEP], ed.[POINT_TYPE], ed.[TESTDATA_ID]
FROM [dbo].[Header] eh 
JOIN
[dbo].[TestData] ed ON eh.[RUN_NUMBER] = ed.[RUN_NUMBER] 

WHERE eh.[RUN_NUMBER] = '01007230')

SELECT [RUN_NUMBER]
,col+value as col,value FROM (
SELECT  [RUN_NUMBER],[NOTCH_STEP] as notch,[POINT_TYPE] as ptype
,[TESTDATA_ID] as id FROM mn_result 
GROUP BY [RUN_NUMBER],[NOTCH_STEP],[POINT_TYPE],[TESTDATA_ID]) rt
unpivot ( value FOR col in (notch,ptype))unpiv
ORDER BY col

【问题讨论】:

  • 这是什么 RDBMS?请添加相关标签进行清理
  • 所需的输出无效,因为您有重复的 8 个标题。
  • 我使用的是 SQL Server MS 2012。
  • @parfait - 两行可以单行显示吗?

标签: sql sql-server pivot unpivot


【解决方案1】:

考虑PIVOTCROSS JOINCROSS APPLY,其中SELECT 语句都以ENGINETESTDATA_ID 列为中心:

WITH mn_result AS (
   SELECT eh.ENGINETESTDATA_ID, eh.[RUN_NUMBER], ed.[NOTCH_STEP], 
          ed.[POINT_TYPE], ed.[TESTDATA_ID]
   FROM [dbo].[Header] eh 
   JOIN [dbo].[TestData] ed ON eh.[RUN_NUMBER] = ed.[RUN_NUMBER] 
   WHERE eh.[RUN_NUMBER] = '01007230'
)

SELECT s1.*, s2.*
FROM
(
SELECT t.[118427] As [Notch1], 
       t.[118428] As [Notch2], 
       t.[118429] As [Notch3], 
       t.[118430] As [Notch4], 
       t.[118431] As [Notch5], 
       t.[118432] As [Notch6], 
       t.[118433] As [Notch7]

FROM (SELECT ENGINETESTDATA_ID, NOTCH_STEP FROM mn_result) r

PIVOT 
  (
    MAX(r.[NOTCH_STEP]) 
    FOR r.ENGINETESTDATA_ID IN ([118427], [118428], [118429], [118430], 
                                [118431], [118432], [118432])
  ) AS t
) s1

CROSS APPLY
(
SELECT t.[118427] As [Ptype1], 
       t.[118428] As [Ptype2], 
       t.[118429] As [Ptype3], 
       t.[118430] As [Ptype4], 
       t.[118431] As [Ptype5], 
       t.[118432] As [Ptype6], 
       t.[118433] As [Ptype7]

FROM (SELECT ENGINETESTDATA_ID, POINT_TYPE FROM mn_result) r

PIVOT 
  (
    MAX(r.[POINT_TYPE]) 
    FOR r.ENGINETESTDATA_ID IN ([118427], [118428], [118429], [118430], 
                                [118431], [118432], [118433])
  ) AS t
) s2

Rextester Demo

【讨论】:

  • @Parfait-感谢您的帮助。 Pivot 生成值为“NULL”,但 mn_result - select 确实生成了值。
  • 不..添加了当前数据结构的另一张图片..如果可能的话,请看看你是否可以帮助我
  • 查看编辑并查看带有示例数据的演示链接。尝试调整您的实际数据以与示例保持一致。注意枢轴列,现在ENGINETESTDATA_ID 是如何以它的值[118427], [118428],... 作为新标题的,而行值是聚合列MAX(r.[NOTCH_STEP])MAX(r.[POINT_TYPE])
  • 你太棒了!!请建议我如何为动态运行编号运行此程序,因为如果我更改 Enginetestdata_ID 特定于运行编号“01007230”,那么它将失败。
  • 哦不..早期版本非常适合值“01007230”,对于这个运行号,ID 是“118427,28,29...”,但如果我替换运行号到 '01007230' 的 ID 可能是 '118477,78,79..',。如何在枢轴中更改它以具有动态 ID。希望你能通过一些建议
猜你喜欢
  • 2021-12-27
  • 2021-01-21
  • 2016-04-15
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多