【问题标题】:Split a Table into 2 or more Tables based on Column value根据列值将表拆分为 2 个或多个表
【发布时间】:2012-10-06 05:27:14
【问题描述】:

我有一个名为“MIVTable”的表,其中包含以下记录,

    MIVID      Quantity         Value
   ------     ----------       --------
      14           10             3000
      14           20             3500
      14           15             2000
      15           20             3000
      15           50             7500
      16           25             2000

这里,我需要根据MIVID将上面的Table存入“HeaderTbl”和“DetailTbl”两个表中,如下:

HeaderTbl:

   HID      MIVID       TotalQuantity    TotalValue
  -----    -------      -------------    -----------
    1         14               45           8500 
    2         15               70          10500
    3         16               25           2000

这里的 HID 是带有标识列的主键。

DetailTbl:

  HID        MIVID        Quantity        Value
 -----      -------     ------------     -------
   1           14             10           3000
   1           14             20           3500
   1           14             15           2000
   2           15             20           3000
   2           15             50           7500
   3           16             25           2000

假设,如果 MIVTable 包含 4 个不同的 MIVID 表示,那么应该根据 HeaderTbl 上的 MIVID 创建 4 行。如何做到这一点?

【问题讨论】:

    标签: sql sql-server-2008 insert


    【解决方案1】:

    要从MIVTableHeaderTbl 中插入记录,请使用:(HID 应该是自动递增的)

    INSERT INTO HeaderTbl
        ([MIVID], [TotalQuantity], [TotalValue])
    SELECT MIVID, SUM(Quantity), SUM(Value) FROM MIVTable GROUP BY MIVID;
    

    要从HeaderTblMIVTableDetailTbl 中插入记录,请使用:

    INSERT INTO DetailTbl
    ([HID], [MIVID], [Quantity], [Value])
        SELECT H.HID, M.* 
          FROM HeaderTbl H 
    INNER JOIN MIVTable M
            ON H.MIVID = M.MIVID;
    

    Look at this SQLFiddle

    这里您需要使用INSERT INTO SELECT 语句将数据从一个表插入到另一个表。你也可以在这样的声明中使用JOIN,就像我为DetailTbl所做的那样。

    【讨论】:

      【解决方案2】:

      您将使用RANK() SQL Server function 生成 HeaderTbl,如下所示:

      SELECT RANK() OVER (ORDER BY MIVID) as HID, MIVID, TotalQuantity, TotalValue
      FROM 
      (
      SELECT 
          MIVID, 
          SUM(Quantity) as TotalQuantity, 
          SUM(Value) as TotalValue 
      FROM MIVTable GROUP BY MIVID
      ) AS A
      

      和Detail表使用ROW_NUMBER() SQL Server function,如下:

      SELECT 
          ROW_NUMBER() OVER (ORDER BY MIVID) AS HID, 
          MIVID, 
          Quantity, 
          Value 
      FROM MIVTable
      

      【讨论】:

        猜你喜欢
        • 2022-12-22
        • 2012-09-26
        • 1970-01-01
        • 1970-01-01
        • 2019-10-12
        • 1970-01-01
        • 2013-08-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多