根据列值将表拆分为2个或更多表

时间:2012-10-06 05:27:15

标签: sql sql-server-2008 insert

我有一个名为“MIVTable”的表,它有以下记录,

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

在这里,我需要将上面的表存储到两个表中,例如基于MIVID的“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行。怎么做?

2 个答案:

答案 0 :(得分:2)

要从HeaderTbl MIVTable插入记录,请使用此代码:( HID应自动增加)

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

要从DetailTblHeaderTbl MIVTable插入记录,请使用此处:

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

答案 1 :(得分:1)

您将使用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

和详细信息表使用ROW_NUMBER() SQL Server function,如下所示:

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