繁体   English   中英

sql 服务器中的表行到列

[英]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.

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