Таблица строк в столбцы в SQL Server - PullRequest
0 голосов
/ 28 октября 2019

У меня есть заголовок и таблица сведений. Я хочу, чтобы имена моих столбцов повторялись для каждой строки.

В моей таблице заголовков есть такие данные

---------------------------------
ID      Product         Status
---------------------------------
1       P1              S1
---------------------------------

А у моих данных есть такие данные.

---------------------------------
ID      Spec1   Spec2   Spec3
---------------------------------
1       A       B       C
1       D       E       F
1       G       H       I
---------------------------------

Я хочу, чтобы мои выходные данные были такими, т.е. строки таблицы в столбцы

 ----------------------------------------------------------------------------
 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)

Это работает, но я хочу знать, есть ли другиерешение для этого?

1 Ответ

0 голосов
/ 28 октября 2019

Я бы использовал кросс-таблицу, а не "ужасный" 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...