[英]Table Rows to columns in sql server
我有一个 header 和一个详细信息表。 我希望每一行都重复我的列名。
我的 header 表有这样的数据
---------------------------------
ID Product Status
---------------------------------
1 P1 S1
---------------------------------
我的详细信息有这样的数据。
---------------------------------
ID Spec1 Spec2 Spec3
---------------------------------
1 A B C
1 D E F
1 G H I
---------------------------------
我想要我的 output 像这样,即表行到列
----------------------------------------------------------------------------
Product Status S11 S12 S13 S21 S22 S23 S31 S32 S33
----------------------------------------------------------------------------
P1 S1 A D G B E H C F I
----------------------------------------------------------------------------
我试过这样..
SELECT Hdr.Status,
Hdr.Product,
Dtl.Spec1,
Dtl.Spec2,
Dtl.Spec3,
ROW_NUMBER() OVER(ORDER BY Hdr.Root_uuid) AS SlNo
INTO #Temp
FROM TBL_HOME_HEADER_TEST Hdr
JOIN TBL_HOME_Detail_TEST Dtl
ON (Hdr.ID = Dtl.ID)
DECLARE @RowNo Int = 1,
@RowCount Int = (SELECT COUNT(*) FROM #Temp),
@Field1 Varchar(100),
@Field2 Varchar(100),
@Field3 Varchar(100),
@ProductName Varchar(100),
@StatusName Varchar(100),
@Query NVarchar(max) = ''
SELECT DISTINCT @StatusName = Status,@ProductName = Product
FROM #Temp
SET @Query = 'SELECT '''+@StatusName+'''AS Status , '''+
@ProductName+''' AS ProductName '
WHILE @RowCount <> 0
BEGIN
SELECT @Field1 = Spec1,
@Field2 = Spec2,
@Field3 = Spec3
FROM #Temp
WHERE SlNo = @RowNo
SET @Query = @Query + ','''+@Field1+'''AS
Filed'+CONVERT(Varchar(10),@RowNo)+'#Name , '''+ @Field2+''' AS
Field'+CONVERT(Varchar(10),@RowNo)+'#Name ,'''+@Field3+''' AS
Field'+CONVERT(Varchar(10),@RowNo)+'#Name'
SET @RowNo = @RowNo +1
SET @RowCount = @RowCount - 1
END
EXECUTE (@Query)
它正在工作,但我想知道,还有其他解决方案吗?
我会使用交叉表,而不是“糟糕”的WHILE
来执行此操作:
CREATE TABLE dbo.Header (ID int,
Product char(2),
Status char(2));
GO
CREATE TABLE dbo.Detail (ID int,
Spec1 char(1),
Spec2 char(1),
Spec3 char(1));
GO
INSERT INTO dbo.Header (ID,
Product,
Status)
VALUES(1,'P1','S1');
GO
INSERT INTO dbo.Detail (ID,
Spec1,
Spec2,
Spec3)
VALUES(1,'A','B','C'),
(1,'D','E','F'),
(1,'G','H','I');
GO
WITH RNs AS(
SELECT ID,
Spec1,
Spec2,
Spec3,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Spec1,Spec2,Spec3) AS RN
FROM dbo.Detail)
SELECT H.ID,
H.Status,
MAX(CASE R.RN WHEN 1 THEN R.Spec1 END) AS S11,
MAX(CASE R.RN WHEN 2 THEN R.Spec1 END) AS S12,
MAX(CASE R.RN WHEN 3 THEN R.Spec1 END) AS S13,
MAX(CASE R.RN WHEN 1 THEN R.Spec2 END) AS S21,
MAX(CASE R.RN WHEN 2 THEN R.Spec2 END) AS S22,
MAX(CASE R.RN WHEN 3 THEN R.Spec2 END) AS S23,
MAX(CASE R.RN WHEN 1 THEN R.Spec3 END) AS S31,
MAX(CASE R.RN WHEN 2 THEN R.Spec3 END) AS S32,
MAX(CASE R.RN WHEN 3 THEN R.Spec3 END) AS S33
FROM dbo.Header H
JOIN RNs R ON H.ID = R.ID
GROUP BY H.ID,
H.Status;
GO
DROP TABLE dbo.Header;
DROP TABLE dbo.Detail;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.