简体   繁体   English

取消一个SQL(列到行)

[英]unpivot a sql (columns to rows)

I have a table with 7 columns and I am trying to unpivot to rows. 我有一个包含7列的表格,并且试图取消对行的透视。 All the Columns starting P1Start should be a new column in new Unpivoted table. 从P1Start开始的所有列都应该是新的Unpivoted表中的新列。 The table should like sample_Unpivot table: P1Start, P1End, P2Start, P2End ... should be a row value. 该表应类似于sample_Unpivot表:P1Start,P1End,P2Start,P2End ...应该是行值。 I have attached the insert script below. 我已经在下面附加了插入脚本。 Can you please provide me the code? 能否请您提供代码?

CREATE TABLE [dbo].[sample](
 [id] [int] NULL,
 [P1StartOrderDate] [datetime] NULL,
 [P1StartReceiveDate] [datetime] NULL,
 [P1EndOrderDate] [datetime] NULL,
 [P1EndReceiveDate] [datetime] NULL,
 [P2StartOrderDate] [datetime] NULL,
 [P2StartReceiveDate] [datetime] NULL,
 [P2EndOrderDate] [datetime] NULL,
 [P2EndReceiveDate] [datetime] NULL
) 

CREATE TABLE [dbo].[sample_unpivot](
 [id] [int] NULL,
 [Phase] [char](30) NULL,
 [OrderDate] [datetime] NULL,
 [ReceiveDate] [datetime] NULL
)  

INSERT [dbo].[sample] ([id], [P1StartOrderDate], [P1StartReceiveDate], [P1EndOrderDate], [P1EndReceiveDate], [P2StartOrderDate], [P2StartReceiveDate], [P2EndOrderDate], [P2EndReceiveDate]) VALUES (1, CAST(N'2020-01-01 00:00:00.000' AS DateTime), CAST(N'2020-01-03 00:00:00.000' AS DateTime), CAST(N'2020-05-01 00:00:00.000' AS DateTime), CAST(N'2010-01-01 00:00:00.000' AS DateTime), CAST(N'2020-08-01 00:00:00.000' AS DateTime), CAST(N'2020-01-11 00:00:00.000' AS DateTime), CAST(N'2020-05-03 00:00:00.000' AS DateTime), CAST(N'2020-01-04 00:00:00.000' AS DateTime))
GO
INSERT [dbo].[sample_unpivot] ([id], [Phase], [OrderDate], [ReceiveDate]) VALUES (1, N'P1Start  ', CAST(N'2020-01-01 00:00:00.000' AS DateTime), CAST(N'2020-01-03 00:00:00.000' AS DateTime))
GO
INSERT [dbo].[sample_unpivot] ([id], [Phase], [OrderDate], [ReceiveDate]) VALUES (1, N'P1End  ', CAST(N'2020-05-01 00:00:00.000' AS DateTime), CAST(N'2020-01-01 00:00:00.000' AS DateTime))
GO
INSERT [dbo].[sample_unpivot] ([id], [Phase], [OrderDate], [ReceiveDate]) VALUES (1, N'P2Start  ', CAST(N'2020-08-01 00:00:00.000' AS DateTime), CAST(N'2020-01-11 00:00:00.000' AS DateTime))
GO
INSERT [dbo].[sample_unpivot] ([id], [Phase], [OrderDate], [ReceiveDate]) VALUES (1, N'P2End  ', CAST(N'2020-05-03 00:00:00.000' AS DateTime), CAST(N'2020-01-04 00:00:00.000' AS DateTime))
GO

Your table structure suggests SQL Server syntax, so i would do : 您的表结构建议使用SQL Server语法,所以我会这样做:

select s.id, ss.*
from sample s cross apply
     ( values ('P1Start', P1StartOrderDate, P1StartReceiveDate),
              ('P1End', P1EndOrderDate, P1EndReceiveDate),
              ('P2Start', P2StartOrderDate, P2StartReceiveDate),
              ('P2End', P2EndOrderDate, P2EndReceiveDate)
     ) ss(Phase, OrderDate, ReceiveDate);

Another way you can try to use UNION ALL to make it. 您可以尝试使用UNION ALL进行创建的另一种方法。

select id,'P1Start' Phase, P1StartOrderDate OrderDate, P1StartReceiveDate ReceiveDate
from sample s
UNION ALL
select id,'P1End' Phase,P1EndOrderDate, P1EndReceiveDate
from sample s
UNION ALL
select id,'P2Start' Phase, P2StartOrderDate, P2StartReceiveDate
from sample s
UNION ALL
select id,'P2End' Phase,  P2EndOrderDate, P2EndReceiveDate
from sample s

sqlfiddle sqlfiddle

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM