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.   

    select ID号,品名,sum(数量) as 数量
    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.品名
      

  2.   

    楼主的说明:
    CSDMN(冒牌经理 V0.3)的方法应该不对吧!!还有别的意见吗?
      

  3.   

    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 表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--没办法,这么写吧,看起来也挺漂亮
     
      

  4.   

    楼主的说明:谢谢 CSDMN(冒牌经理 V0.3)小弟看了一下,第二句好象不是很对,我先试试看吧……呵呵
      

  5.   

    //答案: //游标处理
    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
      

  6.   

    CSDMN(冒牌经理 V0.3) ( 做了临时表的处理了,先处理UPDATE再处理 INSERT。跑两次,,,
      

  7.   

    学习一下,关注冒牌拿得到10分不~HOHO
      

  8.   

    支持一下冒牌不够,我喜欢这样操作(如果队的话,冒牌是头功)insert 表2(ID号,品名)
    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.品名
      

  9.   

    xujexy() :
    先insert后update不好,因为insert的语句也会被update,多操作了一次