【问题标题】:T SQL Rotate row into columnsT SQL 将行旋转成列
【发布时间】:2010-05-20 21:30:00
【问题描述】:

使用 T-SQL 的 SQL 2005,我想将行旋转为列。示例脚本:

Use TempDB
Go

CREATE TABLE [dbo].[CPPrinter_InkLevels](
    [CPPrinter_InkLevels_ID] [int] IDENTITY(1,1) NOT NULL,
    [CPMeasurementGUID] [uniqueidentifier] NOT NULL,
    [InkName] [varchar](30) NOT NULL,
    [InkLevel] [decimal](6, 2) NOT NULL,
 CONSTRAINT [PK_CPPrinter_InkLevels] PRIMARY KEY CLUSTERED 
(
    [CPPrinter_InkLevels_ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

SET IDENTITY_INSERT [dbo].[CPPrinter_InkLevels] ON
INSERT [dbo].[CPPrinter_InkLevels] ([CPPrinter_InkLevels_ID], [CPMeasurementGUID], [InkName], [InkLevel]) VALUES (1, N'6acc1562-4e02-45ff-b480-9e01fb97fccf', N'Black', CAST(0.60 AS Decimal(6, 2)))
INSERT [dbo].[CPPrinter_InkLevels] ([CPPrinter_InkLevels_ID], [CPMeasurementGUID], [InkName], [InkLevel]) VALUES (2, N'6acc1562-4e02-45ff-b480-9e01fb97fccf', N'Cyan', CAST(0.69 AS Decimal(6, 2)))
INSERT [dbo].[CPPrinter_InkLevels] ([CPPrinter_InkLevels_ID], [CPMeasurementGUID], [InkName], [InkLevel]) VALUES (3, N'6acc1562-4e02-45ff-b480-9e01fb97fccf', N'Magenta', CAST(0.55 AS Decimal(6, 2)))
INSERT [dbo].[CPPrinter_InkLevels] ([CPPrinter_InkLevels_ID], [CPMeasurementGUID], [InkName], [InkLevel]) VALUES (4, N'6acc1562-4e02-45ff-b480-9e01fb97fccf', N'Yellow', CAST(0.51 AS Decimal(6, 2)))
INSERT [dbo].[CPPrinter_InkLevels] ([CPPrinter_InkLevels_ID], [CPMeasurementGUID], [InkName], [InkLevel]) VALUES (5, N'6acc1562-4e02-45ff-b480-9e01fb97fccf', N'Light Black', CAST(0.64 AS Decimal(6, 2)))
INSERT [dbo].[CPPrinter_InkLevels] ([CPPrinter_InkLevels_ID], [CPMeasurementGUID], [InkName], [InkLevel]) VALUES (6, N'6acc1562-4e02-45ff-b480-9e01fb97fccf', N'Light Cyan', CAST(0.43 AS Decimal(6, 2)))
INSERT [dbo].[CPPrinter_InkLevels] ([CPPrinter_InkLevels_ID], [CPMeasurementGUID], [InkName], [InkLevel]) VALUES (7, N'6acc1562-4e02-45ff-b480-9e01fb97fccf', N'Light Magenta', CAST(0.30 AS Decimal(6, 2)))
INSERT [dbo].[CPPrinter_InkLevels] ([CPPrinter_InkLevels_ID], [CPMeasurementGUID], [InkName], [InkLevel]) VALUES (8, N'6acc1562-4e02-45ff-b480-9e01fb97fccf', N'Waste Tank', CAST(0.18 AS Decimal(6, 2)))
INSERT [dbo].[CPPrinter_InkLevels] ([CPPrinter_InkLevels_ID], [CPMeasurementGUID], [InkName], [InkLevel]) VALUES (9, N'932348a7-6e2f-4a10-9760-be1ae640c7d7', N'Black', CAST(0.60 AS Decimal(6, 2)))
INSERT [dbo].[CPPrinter_InkLevels] ([CPPrinter_InkLevels_ID], [CPMeasurementGUID], [InkName], [InkLevel]) VALUES (10, N'932348a7-6e2f-4a10-9760-be1ae640c7d7', N'Cyan', CAST(0.69 AS Decimal(6, 2)))
INSERT [dbo].[CPPrinter_InkLevels] ([CPPrinter_InkLevels_ID], [CPMeasurementGUID], [InkName], [InkLevel]) VALUES (11, N'932348a7-6e2f-4a10-9760-be1ae640c7d7', N'Magenta', CAST(0.55 AS Decimal(6, 2)))
INSERT [dbo].[CPPrinter_InkLevels] ([CPPrinter_InkLevels_ID], [CPMeasurementGUID], [InkName], [InkLevel]) VALUES (12, N'932348a7-6e2f-4a10-9760-be1ae640c7d7', N'Yellow', CAST(0.51 AS Decimal(6, 2)))
INSERT [dbo].[CPPrinter_InkLevels] ([CPPrinter_InkLevels_ID], [CPMeasurementGUID], [InkName], [InkLevel]) VALUES (13, N'932348a7-6e2f-4a10-9760-be1ae640c7d7', N'Light Black', CAST(0.64 AS Decimal(6, 2)))
INSERT [dbo].[CPPrinter_InkLevels] ([CPPrinter_InkLevels_ID], [CPMeasurementGUID], [InkName], [InkLevel]) VALUES (14, N'932348a7-6e2f-4a10-9760-be1ae640c7d7', N'Light Cyan', CAST(0.43 AS Decimal(6, 2)))
Go

SELECT * FROM [dbo].[CPPrinter_InkLevels]

--期望的输出 CPMeasuremnetGUID, Ink1, Level1, Ink2, Level2, Ink3, Level3....

【问题讨论】:

    标签: sql-server-2005 tsql pivot


    【解决方案1】:

    最多可以处理 10 个:

    SELECT  *
    FROM    (
             SELECT CPMeasurementGUID
                   ,col + CAST(Seq AS varchar) AS colname
                   ,val
             FROM   (
                     SELECT CPMeasurementGUID
                           ,ROW_NUMBER() OVER (PARTITION BY CPMeasurementGUID ORDER BY CPPrinter_InkLevels_ID) AS Seq
                           ,CAST(InkName AS varchar) AS Ink
                           ,CAST(InkLevel AS varchar) AS Level
                     FROM   [dbo].[CPPrinter_InkLevels]
                    ) AS X UNPIVOT ( val FOR col IN ([Ink], [Level]) ) AS unpvt
            ) AS Y PIVOT ( MAX(val) FOR colname IN ([Ink1], [Level1], [Ink2], [Level2], [Ink3], [Level3], [Ink4], [Level4],
                                                    [Ink5], [Level5], [Ink6], [Level6], [Ink7], [Level7], [Ink8], [Level8],
                                                    [Ink9], [Level9], [Ink10], [Level10]) ) AS pvt
    

    【讨论】:

    • 你能解释一下你在做什么吗?取消旋转和旋转部分
    • @cshah - 单独运行每个部分,您应该能够看到发生了什么。 UNPIVOT 需要将 InkName 和 InkLevel 列对转换为行,将基于添加到 X 子查询中的基础数据的 ROW_NUMBER 生成的每对行的数字保持在一起。然后使用 PIVOT 将行转换为列。
    猜你喜欢
    • 2017-09-25
    • 2021-02-15
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多