如何将数据插入到SQL Server中具有多行到一行的另一个表中?

时间:2016-07-28 04:06:22

标签: sql-server

我已经因为这个问题而被困了几天,希望有人能给我一个想法。提前谢谢。

我担心的是,我想将table2的数据插入table1。在table2中它是行(day1到day2),我想在table1中插入每个id的单行。

id#:01在table2中有day1和day2。

Please refer to this image

2 个答案:

答案 0 :(得分:0)

;with sum_cte (id, name, gender, TotalOTMinis, TotalUTMins, TotalWorkMins)
as(
   select id, name, gender, sum(OvertimeMins), sum(UndertimeMins), sum(WorkMins) group by id
),
day1_cte (rownum, id, day1OTMins, day1UTMins, day1WrokMins)
as(
  select row_number() (over order by date) as rownum,id, OvertimeMins, UndertimeMins, WorkMins from table2 where rownum=1
),
day2_cte (rownum, id, day2OTMins, day2UTMins, day2WrokMins)
as(
select row_number() (over order by date) as rownum,id, OvertimeMins, UndertimeMins, WorkMins from table2 where rownum=2
)
insert into table1
select sum_cte.id, name, gender, TotalOTMinis, TotalUTMins, TotalWorkMins, day1OTMins, day1UTMins, day1WrokMins ,day2OTMins, day2UTMins, day2WrokMins
from sum_cte inner join day1_cte on sum_cte.id = day1_cte.id
inner join day2_cte on sum_cte.id = day2_cte

答案 1 :(得分:0)

我希望有人能为您提供更整洁的解决方案,因为我也有兴趣看到它。我能解决问题的唯一方法是对总和数据进行初始插入,然后更新各个统计数据:

DECLARE @Table2 TABLE
(
ID INT,
Name CHAR,
Gender CHAR,
Dt DATE,
OvertimeMins INT,
UndertimeMins INT,
WorkMins INT
)
INSERT INTO @TABLE2 (ID, Name, Gender, DT, OvertimeMins, UndertimeMins, WorkMins) SELECT 01, 'A', 'M', '28 Jul 2017', 30, 0, 240
INSERT INTO @TABLE2 (ID, Name, Gender, DT, OvertimeMins, UndertimeMins, WorkMins) SELECT 01, 'A', 'M', '29 Jul 2017', 60, 0, 240


DECLARE @Table1 TABLE
(
    ID INT,
    Name CHAR,
    Gender CHAR,
    TotalOtMins INT,
    TotalUTMins INT,
    TotalWorkMins INT,
    Day1OTMins INT,
    Day1UTMIns INT,
    Day1WorkMIns INT,
    Day2OTMins INT,
    Day2UTMIns INT,
    Day2WorkMIns INT
)

INSERT INTO @Table1
(ID, Name, Gender, TotalOtMins, TotalUTMins, TotalWorkMins)
SELECT  ID, MIN(Name), MIN(Gender), SUM(OvertimeMins), SUM(UndertimeMins), Sum(WorkMins)
FROM @TABLE2
GROUP BY ID

UPDATE T1
SET Day1OTMins = Day1.OvertimeMins,
    Day1UTMins = Day1.UndertimeMins,
    Day1WorkMIns = Day1.WorkMins,
    Day2OTMins = Day2.OvertimeMins,
    Day2UTMIns = Day2.UndertimeMins,
    Day2WorkMIns = Day2.WorkMins
FROM @Table1 T1
CROSS APPLY
(
    SELECT TOP 1 OvertimeMIns, UndertimeMins, WorkMins
    FROM @Table2
    WHERE ID = T1.ID
    ORDER BY Dt ASC
) as Day1
CROSS APPLY
(
    SELECT TOP 1 OvertimeMIns, UndertimeMins, WorkMins
    FROM @Table2
    WHERE ID = T1.ID
    ORDER BY Dt DESC
) as Day2

SELECT *
FROM @Table1