现有明细,汇总两个表,明细如下,请问怎么可以直接把数据更新到汇总表?(不创建临时表的情况下)明细
店铺    商品   数量
一         A          2
一         B          1
一         B          3
一         B          4
一         C          2
二         A          3
二         B          2
三         B          2汇总
店铺    商品    数量(总)
一        A
一        B
一        C
二        A
二        B
三        A
三        C

解决方案 »

  1.   

    ----------------------------------------------------------------
    -- Author  :DBA_HuangZJ(發糞塗牆)
    -- Date    :2014-08-04 16:17:26
    -- Version:
    --      Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 
    -- May 14 2014 18:34:29 
    -- Copyright (c) Microsoft Corporation
    -- Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
    --
    ----------------------------------------------------------------
    --> 测试数据:[TB1]
    if object_id('[TB1]') is not null drop table [TB1]
    go 
    create table [TB1]([店铺] varchar(2),[商品] varchar(1),[数量] int)
    insert [TB1]
    select '一','A',2 union all
    select '一','B',1 union all
    select '一','B',3 union all
    select '一','B',4 union all
    select '一','C',2 union all
    select '二','A',3 union all
    select '二','B',2 union all
    select '三','B',2
    --> 测试数据:[TB2]
    if object_id('[TB2]') is not null drop table [TB2]
    go 
    create table [TB2]([店铺] varchar(2),[商品] varchar(1),[数量(总)] INT)
    insert [TB2]
    select '一','A',null union all
    select '一','B',null union all
    select '一','C',null union all
    select '二','A',null union all
    select '二','B',null union all
    select '三','A',null union all
    select '三','C',null
    --------------开始查询--------------------------select * from [TB2]UPDATE tb2
    SET [数量(总)]=a.数量
    FROM tb2 INNER JOIN (select[店铺], [商品],ISNULL(SUM(数量),0) 数量
    from [TB1]
    GROUP BY [店铺], [商品]) a ON tb2.店铺=a.店铺 AND tb2.商品=a.商品SELECT * FROM tb2
    ----------------结果----------------------------
    /* 
    店铺   商品   数量(总)
    ---- ---- -----------
    一    A    NULL
    一    B    NULL
    一    C    NULL
    二    A    NULL
    二    B    NULL
    三    A    NULL
    三    C    NULL(7 行受影响)(5 行受影响)店铺   商品   数量(总)
    ---- ---- -----------
    一    A    2
    一    B    8
    一    C    2
    二    A    3
    二    B    2
    三    A    NULL
    三    C    NULL
    */
      

  2.   

    UPDATE 汇总
       SET 数量 = (SELECT SUM(数量)
                     FROM 明细
                    WHERE 明细.店铺 = 汇总.店铺
                      AND 明细.商品 = 汇总.商品)  FROM 汇总,明细
      

  3.   

    UPDATE 汇总
       SET 数量 = (SELECT SUM(数量)
                     FROM 明细
                    WHERE 明细.店铺 = 汇总.店铺
                      AND 明细.商品 = 汇总.商品)  FROM 汇总,明细执行报错,提示:
    无法绑定由多个部分组成的标识符 "明细.门店"
      

  4.   

    忘记 UPDATE 不能是一对多的关系了,
    只能先汇总再 UPDATE,和2楼代码等价,不献丑了。
      

  5.   

    先汇总再UPDATE,就是说一定要建个临时表了?
      

  6.   

    我用TB1、TB2代替了你的表名,你不会看不懂吧?
      

  7.   

    没索引你还能期望能有多块啊,把下面两个语句中的表名和列名替换成你真正的表名和列名然后执行一下,记得先停掉updatecreate index IX_details on 明细表 (店铺  , 商品);
    create index IX_SUM on 汇总表 (店铺  , 商品);
      

  8.   

    创建索引后直接UPDATE?
      

  9.   

    create table 明细
    (店铺 char(20),
    商品 char(10),
    数量 decimal(10,2))
    create table 汇总
    (店铺 char(20),
    商品 char(10),
    数量 decimal(10,2))insert into 明细 values
    ('一','A',2),('一','B',1),
    ('一','B',3),('一','B',4),
    ('一','C',2),('二','A',3),
    ('二','B',2),('三','B',2)insert into 汇总 values
    ('一','A',null),('一','B',null),
    ('一','C',null),('二','A',null),
    ('二','B',null),('三','A',null),
    ('三','B',null),('三','C',null)select * from 明细
    select * from 汇总update a set a.数量=(select SUM(b.数量) from 明细 b
      where b.店铺=a.店铺 and b.商品=a.商品 ) from 汇总 a 
      

  10.   

    先创建再update