Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 列转换为行,并生成列的主表_Sql Server_Tsql - Fatal编程技术网

Sql server 列转换为行,并生成列的主表

Sql server 列转换为行,并生成列的主表,sql-server,tsql,Sql Server,Tsql,我需要将列数据插入另一个表,并为列创建主表 例如:我需要将表tblcatData转换为两个表tblCat和tblcatDataNew tblCatData Primaykey | A | B | C | D | D | F | G | H | I | J | K | L | M | -------------------------------------------------------------------- 1 | 1 | 2 | 3 | 5 | 5 |

我需要将列数据插入另一个表,并为列创建主表

例如:我需要将表tblcatData转换为两个表tblCattblcatDataNew

tblCatData

    Primaykey | A | B | C | D | D | F | G | H | I | J | K | L | M |
--------------------------------------------------------------------
    1         | 1 | 2 | 3 | 5 | 5 | 5 | 3 | 3 | 3 | 1 | 4 | 1 | 1 |
    2         | 1 | 2 | 5 | 5 | 5 | 5 | 3 | 5 | 3 | 1 | 1 | 5 | 1 |
    3         | 5 | 2 | 3 | 5 | 5 | 5 | 5 | 3 | 3 | 1 | 1 | 1 | 4 |
tblCat

    PrimaryKey | Category
----------------------------
    1          | A
    2          | B
    3          | C
    4          | D
    5          | E
    6          | F
    7          | G
    .            .
    .            .
    .            .
tblCatDataNew

    PrimaryKey | FK_CatID | Data |
-----------------------------------
    1          | 1        | 1    |
    2          | 1        | 1    |
    3          | 1        | 5    |
    4          | 2        | 2    |
    5          | 2        | 2    |
    6          | 2        | 2    |
    7          | 3        | 3    |
    8          | 3        | 5    |
    .            .          .
    .            .          .
    .            .          .

您可以使用
union
取消填充列,然后
选择。。。进入
以将结果存储在新表中:

select  PrimaryKey
,       FK_CatId
,       Category
into    tblCatDataNew
from    (
        select  PrimaryKey
        ,       1
        ,       A
        from    tblCatData
        union all
        select  PrimaryKey
        ,       2
        ,       B
        from    tblCatData
        union all
        ...
        )

您可以使用
union
取消填充列,然后
选择。。。进入
以将结果存储在新表中:

select  PrimaryKey
,       FK_CatId
,       Category
into    tblCatDataNew
from    (
        select  PrimaryKey
        ,       1
        ,       A
        from    tblCatData
        union all
        select  PrimaryKey
        ,       2
        ,       B
        from    tblCatData
        union all
        ...
        )

您可以尝试以下场景:

  • 创建
    tblCat

  • 创建与原始设计有以下偏差的
    tblCatDataNew

    • 允许
      FK_CatID
      列暂时接受空值(或者永久接受空值,如果这是您的初衷的话)

    • 临时添加一个额外的列以接收原始表中的类别名称

  • 取消PIVOT
    tblCatData
    并将结果插入
    tblCatDataNew
    (将值插入
    数据中
    并将列名作为类别名称插入临时列)

  • tblCatDataNew
    中选择所有不同的类别名称,并将它们插入
    tblCat
    中。(这将为它们生成键值。)

  • tblCat
    更新
    tblCatDataNew
    中的外键,按类别名称连接两个表

  • tblCatDataNew
    中删除临时列

  • tblcatanew.FK_CatID
    设置为
    notnull
    (也就是说,如果您希望的话)

  • 下面是整个测试脚本,包括创建原始表(以防有人想尝试):

    请注意,从2005版本开始,SQL Server中支持UNPIVOT子句。在早期版本中,您必须使用不同的方法取消PIVOT数据(步骤3),例如:

    INSERT INTO tblCatDataNew (
      Data,
      Category
    )
    SELECT
      Data = CASE x.CatNum
        WHEN  1 THEN A
        WHEN  2 THEN B
        WHEN  3 THEN C
        WHEN  4 THEN D
        WHEN  5 THEN E
        WHEN  6 THEN F
        WHEN  7 THEN G
        WHEN  8 THEN H
        WHEN  9 THEN I
        WHEN 10 THEN J
        WHEN 11 THEN K
        WHEN 12 THEN L
        WHEN 13 THEN M
      END,
      Category = CASE x.CatNum
        WHEN  1 THEN 'A'
        WHEN  2 THEN 'B'
        WHEN  3 THEN 'C'
        WHEN  4 THEN 'D'
        WHEN  5 THEN 'E'
        WHEN  6 THEN 'F'
        WHEN  7 THEN 'G'
        WHEN  8 THEN 'H'
        WHEN  9 THEN 'I'
        WHEN 10 THEN 'J'
        WHEN 11 THEN 'K'
        WHEN 12 THEN 'L'
        WHEN 13 THEN 'M'
      END
    FROM tblCatData
      CROSS JOIN (
        SELECT  1 UNION ALL
        SELECT  2 UNION ALL
        SELECT  3 UNION ALL
        SELECT  4 UNION ALL
        SELECT  5 UNION ALL
        SELECT  6 UNION ALL
        SELECT  7 UNION ALL
        SELECT  8 UNION ALL
        SELECT  9 UNION ALL
        SELECT 10 UNION ALL
        SELECT 11 UNION ALL
        SELECT 12 UNION ALL
        SELECT 13
      ) x (CatNum)
    ORDER BY
      Category,
      Primaykey;
    
    INSERT INTO tblCatDataNew (
      Data,
      Category
    )
    SELECT
      Data = CASE x.CatNum
        WHEN  1 THEN A
        WHEN  2 THEN B
        WHEN  3 THEN C
        WHEN  4 THEN D
        WHEN  5 THEN E
        WHEN  6 THEN F
        WHEN  7 THEN G
        WHEN  8 THEN H
        WHEN  9 THEN I
        WHEN 10 THEN J
        WHEN 11 THEN K
        WHEN 12 THEN L
        WHEN 13 THEN M
      END,
      Category = x.CatName
    FROM tblCatData
      CROSS JOIN (
        SELECT  1, 'A' UNION ALL
        SELECT  2, 'B' UNION ALL
        SELECT  3, 'C' UNION ALL
        SELECT  4, 'D' UNION ALL
        SELECT  5, 'E' UNION ALL
        SELECT  6, 'F' UNION ALL
        SELECT  7, 'G' UNION ALL
        SELECT  8, 'H' UNION ALL
        SELECT  9, 'I' UNION ALL
        SELECT 10, 'J' UNION ALL
        SELECT 11, 'K' UNION ALL
        SELECT 12, 'L' UNION ALL
        SELECT 13, 'M'
      ) x (CatNum, CatName)
    ORDER BY
      Category,
      Primaykey;
    
    甚至像这样:

    INSERT INTO tblCatDataNew (
      Data,
      Category
    )
    SELECT
      Data = CASE x.CatNum
        WHEN  1 THEN A
        WHEN  2 THEN B
        WHEN  3 THEN C
        WHEN  4 THEN D
        WHEN  5 THEN E
        WHEN  6 THEN F
        WHEN  7 THEN G
        WHEN  8 THEN H
        WHEN  9 THEN I
        WHEN 10 THEN J
        WHEN 11 THEN K
        WHEN 12 THEN L
        WHEN 13 THEN M
      END,
      Category = CASE x.CatNum
        WHEN  1 THEN 'A'
        WHEN  2 THEN 'B'
        WHEN  3 THEN 'C'
        WHEN  4 THEN 'D'
        WHEN  5 THEN 'E'
        WHEN  6 THEN 'F'
        WHEN  7 THEN 'G'
        WHEN  8 THEN 'H'
        WHEN  9 THEN 'I'
        WHEN 10 THEN 'J'
        WHEN 11 THEN 'K'
        WHEN 12 THEN 'L'
        WHEN 13 THEN 'M'
      END
    FROM tblCatData
      CROSS JOIN (
        SELECT  1 UNION ALL
        SELECT  2 UNION ALL
        SELECT  3 UNION ALL
        SELECT  4 UNION ALL
        SELECT  5 UNION ALL
        SELECT  6 UNION ALL
        SELECT  7 UNION ALL
        SELECT  8 UNION ALL
        SELECT  9 UNION ALL
        SELECT 10 UNION ALL
        SELECT 11 UNION ALL
        SELECT 12 UNION ALL
        SELECT 13
      ) x (CatNum)
    ORDER BY
      Category,
      Primaykey;
    
    INSERT INTO tblCatDataNew (
      Data,
      Category
    )
    SELECT
      Data = CASE x.CatNum
        WHEN  1 THEN A
        WHEN  2 THEN B
        WHEN  3 THEN C
        WHEN  4 THEN D
        WHEN  5 THEN E
        WHEN  6 THEN F
        WHEN  7 THEN G
        WHEN  8 THEN H
        WHEN  9 THEN I
        WHEN 10 THEN J
        WHEN 11 THEN K
        WHEN 12 THEN L
        WHEN 13 THEN M
      END,
      Category = x.CatName
    FROM tblCatData
      CROSS JOIN (
        SELECT  1, 'A' UNION ALL
        SELECT  2, 'B' UNION ALL
        SELECT  3, 'C' UNION ALL
        SELECT  4, 'D' UNION ALL
        SELECT  5, 'E' UNION ALL
        SELECT  6, 'F' UNION ALL
        SELECT  7, 'G' UNION ALL
        SELECT  8, 'H' UNION ALL
        SELECT  9, 'I' UNION ALL
        SELECT 10, 'J' UNION ALL
        SELECT 11, 'K' UNION ALL
        SELECT 12, 'L' UNION ALL
        SELECT 13, 'M'
      ) x (CatNum, CatName)
    ORDER BY
      Category,
      Primaykey;
    
    以下是上述脚本为我生成的结果:

    • tblCat

      PrimaryKey  Category
      ----------- --------------------------------------------------
      1           A
      2           B
      3           C
      4           D
      5           E
      6           F
      7           G
      8           H
      9           I
      10          J
      11          K
      12          L
      13          M
      
    • tblCatDataNew

      PrimaryKey  FK_CatID    Data
      ----------- ----------- -----------
      1           1           1
      2           1           1
      3           1           5
      4           2           2
      5           2           2
      6           2           2
      7           3           3
      8           3           5
      9           3           3
      10          4           5
      11          4           5
      12          4           5
      13          5           5
      14          5           5
      15          5           5
      16          6           5
      17          6           5
      18          6           5
      19          7           3
      20          7           3
      21          7           5
      22          8           3
      23          8           5
      24          8           3
      25          9           3
      26          9           3
      27          9           3
      28          10          1
      29          10          1
      30          10          1
      31          11          4
      32          11          1
      33          11          1
      34          12          1
      35          12          5
      36          12          1
      37          13          1
      38          13          1
      39          13          4
      

    您可以尝试以下场景:

  • 创建
    tblCat

  • 创建与原始设计有以下偏差的
    tblCatDataNew

    • 允许
      FK_CatID
      列暂时接受空值(或者永久接受空值,如果这是您的初衷的话)

    • 临时添加一个额外的列以接收原始表中的类别名称

  • 取消PIVOT
    tblCatData
    并将结果插入
    tblCatDataNew
    (将值插入
    数据中
    并将列名作为类别名称插入临时列)

  • tblCatDataNew
    中选择所有不同的类别名称,并将它们插入
    tblCat
    中。(这将为它们生成键值。)

  • tblCat
    更新
    tblCatDataNew
    中的外键,按类别名称连接两个表

  • tblCatDataNew
    中删除临时列

  • tblcatanew.FK_CatID
    设置为
    notnull
    (也就是说,如果您希望的话)

  • 下面是整个测试脚本,包括创建原始表(以防有人想尝试):

    请注意,从2005版本开始,SQL Server中支持UNPIVOT子句。在早期版本中,您必须使用不同的方法取消PIVOT数据(步骤3),例如:

    INSERT INTO tblCatDataNew (
      Data,
      Category
    )
    SELECT
      Data = CASE x.CatNum
        WHEN  1 THEN A
        WHEN  2 THEN B
        WHEN  3 THEN C
        WHEN  4 THEN D
        WHEN  5 THEN E
        WHEN  6 THEN F
        WHEN  7 THEN G
        WHEN  8 THEN H
        WHEN  9 THEN I
        WHEN 10 THEN J
        WHEN 11 THEN K
        WHEN 12 THEN L
        WHEN 13 THEN M
      END,
      Category = CASE x.CatNum
        WHEN  1 THEN 'A'
        WHEN  2 THEN 'B'
        WHEN  3 THEN 'C'
        WHEN  4 THEN 'D'
        WHEN  5 THEN 'E'
        WHEN  6 THEN 'F'
        WHEN  7 THEN 'G'
        WHEN  8 THEN 'H'
        WHEN  9 THEN 'I'
        WHEN 10 THEN 'J'
        WHEN 11 THEN 'K'
        WHEN 12 THEN 'L'
        WHEN 13 THEN 'M'
      END
    FROM tblCatData
      CROSS JOIN (
        SELECT  1 UNION ALL
        SELECT  2 UNION ALL
        SELECT  3 UNION ALL
        SELECT  4 UNION ALL
        SELECT  5 UNION ALL
        SELECT  6 UNION ALL
        SELECT  7 UNION ALL
        SELECT  8 UNION ALL
        SELECT  9 UNION ALL
        SELECT 10 UNION ALL
        SELECT 11 UNION ALL
        SELECT 12 UNION ALL
        SELECT 13
      ) x (CatNum)
    ORDER BY
      Category,
      Primaykey;
    
    INSERT INTO tblCatDataNew (
      Data,
      Category
    )
    SELECT
      Data = CASE x.CatNum
        WHEN  1 THEN A
        WHEN  2 THEN B
        WHEN  3 THEN C
        WHEN  4 THEN D
        WHEN  5 THEN E
        WHEN  6 THEN F
        WHEN  7 THEN G
        WHEN  8 THEN H
        WHEN  9 THEN I
        WHEN 10 THEN J
        WHEN 11 THEN K
        WHEN 12 THEN L
        WHEN 13 THEN M
      END,
      Category = x.CatName
    FROM tblCatData
      CROSS JOIN (
        SELECT  1, 'A' UNION ALL
        SELECT  2, 'B' UNION ALL
        SELECT  3, 'C' UNION ALL
        SELECT  4, 'D' UNION ALL
        SELECT  5, 'E' UNION ALL
        SELECT  6, 'F' UNION ALL
        SELECT  7, 'G' UNION ALL
        SELECT  8, 'H' UNION ALL
        SELECT  9, 'I' UNION ALL
        SELECT 10, 'J' UNION ALL
        SELECT 11, 'K' UNION ALL
        SELECT 12, 'L' UNION ALL
        SELECT 13, 'M'
      ) x (CatNum, CatName)
    ORDER BY
      Category,
      Primaykey;
    
    甚至像这样:

    INSERT INTO tblCatDataNew (
      Data,
      Category
    )
    SELECT
      Data = CASE x.CatNum
        WHEN  1 THEN A
        WHEN  2 THEN B
        WHEN  3 THEN C
        WHEN  4 THEN D
        WHEN  5 THEN E
        WHEN  6 THEN F
        WHEN  7 THEN G
        WHEN  8 THEN H
        WHEN  9 THEN I
        WHEN 10 THEN J
        WHEN 11 THEN K
        WHEN 12 THEN L
        WHEN 13 THEN M
      END,
      Category = CASE x.CatNum
        WHEN  1 THEN 'A'
        WHEN  2 THEN 'B'
        WHEN  3 THEN 'C'
        WHEN  4 THEN 'D'
        WHEN  5 THEN 'E'
        WHEN  6 THEN 'F'
        WHEN  7 THEN 'G'
        WHEN  8 THEN 'H'
        WHEN  9 THEN 'I'
        WHEN 10 THEN 'J'
        WHEN 11 THEN 'K'
        WHEN 12 THEN 'L'
        WHEN 13 THEN 'M'
      END
    FROM tblCatData
      CROSS JOIN (
        SELECT  1 UNION ALL
        SELECT  2 UNION ALL
        SELECT  3 UNION ALL
        SELECT  4 UNION ALL
        SELECT  5 UNION ALL
        SELECT  6 UNION ALL
        SELECT  7 UNION ALL
        SELECT  8 UNION ALL
        SELECT  9 UNION ALL
        SELECT 10 UNION ALL
        SELECT 11 UNION ALL
        SELECT 12 UNION ALL
        SELECT 13
      ) x (CatNum)
    ORDER BY
      Category,
      Primaykey;
    
    INSERT INTO tblCatDataNew (
      Data,
      Category
    )
    SELECT
      Data = CASE x.CatNum
        WHEN  1 THEN A
        WHEN  2 THEN B
        WHEN  3 THEN C
        WHEN  4 THEN D
        WHEN  5 THEN E
        WHEN  6 THEN F
        WHEN  7 THEN G
        WHEN  8 THEN H
        WHEN  9 THEN I
        WHEN 10 THEN J
        WHEN 11 THEN K
        WHEN 12 THEN L
        WHEN 13 THEN M
      END,
      Category = x.CatName
    FROM tblCatData
      CROSS JOIN (
        SELECT  1, 'A' UNION ALL
        SELECT  2, 'B' UNION ALL
        SELECT  3, 'C' UNION ALL
        SELECT  4, 'D' UNION ALL
        SELECT  5, 'E' UNION ALL
        SELECT  6, 'F' UNION ALL
        SELECT  7, 'G' UNION ALL
        SELECT  8, 'H' UNION ALL
        SELECT  9, 'I' UNION ALL
        SELECT 10, 'J' UNION ALL
        SELECT 11, 'K' UNION ALL
        SELECT 12, 'L' UNION ALL
        SELECT 13, 'M'
      ) x (CatNum, CatName)
    ORDER BY
      Category,
      Primaykey;
    
    以下是上述脚本为我生成的结果:

    • tblCat

      PrimaryKey  Category
      ----------- --------------------------------------------------
      1           A
      2           B
      3           C
      4           D
      5           E
      6           F
      7           G
      8           H
      9           I
      10          J
      11          K
      12          L
      13          M
      
    • tblCatDataNew

      PrimaryKey  FK_CatID    Data
      ----------- ----------- -----------
      1           1           1
      2           1           1
      3           1           5
      4           2           2
      5           2           2
      6           2           2
      7           3           3
      8           3           5
      9           3           3
      10          4           5
      11          4           5
      12          4           5
      13          5           5
      14          5           5
      15          5           5
      16          6           5
      17          6           5
      18          6           5
      19          7           3
      20          7           3
      21          7           5
      22          8           3
      23          8           5
      24          8           3
      25          9           3
      26          9           3
      27          9           3
      28          10          1
      29          10          1
      30          10          1
      31          11          4
      32          11          1
      33          11          1
      34          12          1
      35          12          5
      36          12          1
      37          13          1
      38          13          1
      39          13          4