我用的是MSSQL,有两表,一个表A记录的是用户点击博客情况,表B记录的是博客的点击统计结果: 表A 
------------------------------------------------- 
博客名      用户IP      点击时间 
-------------------------------------------------- 
老三的店    127.0.1.1    2009-1-1 23:21:21 
老三的店    127.0.1.1    2009-1-1 23:21:20 
老三的店    127.0.1.1    2009-1-1 23:21:19 
老三的店    127.0.1.1    2009-1-1 23:21:18 
表B 
------------------------------------------------- 
博客名        累计点击 
------------------------------------------------- 
老三的店        10 
为了效率和屏蔽重复点击,数据库会在凌晨对表A的中数据进行统计(同一IP一小时内只记录一次,这个可以用Group解决),并将统计结果累加到表B中。 请教高手,用SQL怎么实现,对表A的数据统计结果逐一的update到表B中?谢了 

解决方案 »

  1.   

    UPDATE B SET
        累计点击=B.累计点击+A.cnt
    FROM (
        SELECT
            博客名,COUNT(*) AS cnt
        FROM (
            SELECT 博客名
            FROM 表A 
            GROUP BY 博客名,CONVERT(VARCHAR(13),点击时间,120)
        ) AS T
        GROUP BY 博客名
    ) AS A
        JOIN 表B AS B
           ON A.博客名=B.博客名;
      

  2.   

    insert into b(col1,col2)
    select 博客名,count(*)
    from (select distinct 博客名,用户IP,CONVERT(VARCHAR(13),点击时间,120) as 点击时间 from tb )A
    group by 博客名
     
      

  3.   

    累加的话,如果没有先insert,如果已经有了,就直接update上面insert和update都有了if exists(select 1 from tb where 博客名=xxx)
        update ....
    else
        insert into ....
      

  4.   

    INSERT 表B
        SELECT
        FROM(
            SELECT 博客名,COUNT(*) AS cnt
            FROM (
                SELECT 博客名
                  FROM 表A 
                GROUP BY 博客名,CONVERT(VARCHAR(13),点击时间,120)
            ) AS T
        ) AS A
        WHERE NOT EXISTS(
                  SELECT *
                  FROM 表B 
                  WHERE A.博客名=博客名
              );
    UPDATE B SET
        累计点击=B.累计点击+A.cnt
    FROM (
        SELECT
            博客名,COUNT(*) AS cnt
        FROM (
            SELECT 博客名
            FROM 表A 
            GROUP BY 博客名,CONVERT(VARCHAR(13),点击时间,120)
        ) AS T
        GROUP BY 博客名
    ) AS A
        JOIN 表B AS B
           ON A.博客名=B.博客名;
      

  5.   

    update 表B
    set 累计点击=累计点击+a2.点击次数
    from 
    (
    select 
      博客名,
      sum(点击次数) as 点击次数
    from (
          select 
            博客名,
            用户IP,
            count(distinct convert(char(13),点击时间,120)) as 点击次数
          from 表A
         ) a1
    group by 博客名
    ) a2
    where 表B.博客名=a2.博客名
      

  6.   

    update 表B
    set 累计点击=累计点击+a2.点击次数
    from 
    (
    select 
      博客名,
      sum(点击次数) as 点击次数
    from (
          select 
            博客名,
            用户IP,
            count(distinct convert(char(13),点击时间,120)) as 点击次数
          from 表A
         group by 博客名,用户IP
         ) a1
    group by 博客名
    ) a2
    where 表B.博客名=a2.博客名
      

  7.   


    --1.不存在博客名的先插入insert into b select 博客名 , count(distinct convert(varchar(13),点击时间,120)) from A group by 博客名 where 博客名 not in (select 博客名 from b)--2.存在博客名的更新(进行累计)
    update b set 累计点击 = 累计点击 + (select count(distinct convert(varchar(13),点击时间,120)) from A where 博客名 = b.博客名) from b
      

  8.   

    可以把上面两句放在一个存储过程中,每次调用即可.create procedure my_proc
    as
    begin
    --1.不存在博客名的先插入insert into b select 博客名 , count(distinct convert(varchar(13),点击时间,120)) from A group by 博客名 where 博客名 not in (select 博客名 from b)--2.存在博客名的更新(进行累计)
    update b set 累计点击 = 累计点击 + (select count(distinct convert(varchar(13),点击时间,120)) from A where 博客名 = b.博客名) from bend
    goexec my_proc