SQL SERVER中有两个表,结构如下:
表1:
ID号 日期 品名 数量
001 2005-01-01 钢材 10
001 2005-01-09 钢材 20
001 2005-01-13 木材 20
001 2005-01-25 钢材 10
……表2:
ID号 品名 数量
001 钢材 40
001 木材 100(原来数量为80)
……将表1中的数据按照ID号,品名来对数量进行合并,然后判断表2中有没有相同的ID号,品名,如果存在,则将合并的数量累加上去;如果不存在,则将合并好的记录插入表2中。请问这样的SQL语句怎么写??请大侠指点一下,谢谢!!学习,关注……
表1:
ID号 日期 品名 数量
001 2005-01-01 钢材 10
001 2005-01-09 钢材 20
001 2005-01-13 木材 20
001 2005-01-25 钢材 10
……表2:
ID号 品名 数量
001 钢材 40
001 木材 100(原来数量为80)
……将表1中的数据按照ID号,品名来对数量进行合并,然后判断表2中有没有相同的ID号,品名,如果存在,则将合并的数量累加上去;如果不存在,则将合并好的记录插入表2中。请问这样的SQL语句怎么写??请大侠指点一下,谢谢!!学习,关注……
from (
select ID号,品名,数量
from 表1
union all
select ID号,品名,数量
from 表2
) as t
group by ID号,品名
or:select isnull(t.ID号,a.ID号) as ID号,isnull(t.品名,a.品名) as 品名,isnull(t.数量,0)+isnull(a.数量,0) as 数量
from (
select ID号,品名,sum(数量) as 数量
from 表1
group by ID号,品名
) as t
full join 表2 a
on t.ID号=a.ID号 and t.品名=a.品名
CSDMN(冒牌经理 V0.3)的方法应该不对吧!!还有别的意见吗?
set 数量=a.数量+t.数量
from (
select ID号,品名,sum(数量) as 数量
from 表1
group by ID号,品名
) as t
,表2 a
where t.ID号=a.ID号 and t.品名=a.品名insert 表2(ID号,品名,数量)
select t.ID号,t.品名,t.数量
from (
select ID号,品名,sum(数量) as 数量
from 表1
group by ID号,品名
) as t
left join 表2 a
on t.ID号=a.ID号 and t.品名=a.品名
where a.ID号 is null--没办法,这么写吧,看起来也挺漂亮
SET NOCOUNT ON
DECLARE @ID INT, @品名 VARCHAR(50),@数量 INT;
DECLARE CUR CURSOR FOR
SELECT [ID],[品名],SUM(数量) FROM TABLE1 GROUP BY [ID],品名;
OPEN CUR
FETCH CUR INTO @ID,@品名,@数量
WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT @品名
IF EXISTS (SELECT * FROM TABLE2 WHERE [ID] = @ID AND [品名] = @品名)
BEGIN
UPDATE TABLE2 SET [数量] = [数量]+ @数量 WHERE [ID] = @ID AND [品名] = @品名
END
ELSE
BEGIN
INSERT INTO TABLE2 ([ID],[品名],[数量]) VALUES (@ID,@品名,@数量)
END
FETCH CUR INTO @ID,@品名,@数量
END
CLOSE CUR
DEALLOCATE CUR
SET NOCOUNT OFF
select distinct ID号,品名 from 表1 t
left join 表2 a
on t.ID号=a.ID号 and t.品名=a.品名
where a.ID号 is null
update a
set 数量=a.数量+t.数量
from (
select ID号,品名,sum(数量) as 数量
from 表1
group by ID号,品名
) as t
,表2 a
where t.ID号=a.ID号 and t.品名=a.品名
先insert后update不好,因为insert的语句也会被update,多操作了一次