日期:2014-05-18 浏览次数:20551 次
有一个这样的情况,表字段 ID Name 其中ID为主键 Name 序号 ID NAME 1 A '张三' 2 A '张三' 3 A '李四' 4 B '王五' 5 B '王五' 6 B '李四' 其中ID=A的 Name等于‘张三’最多,所以序号3的Name 也需要修改为’张三‘ ID=B的Name 等于’王五‘最多,所以序号6的记录Name也修改成为’王五‘ 这些记录。求一个sql语句来操作。。。。 这些sql,我要定时sql
if object_id('[tbl]') is not null drop table [tbl] create table [tbl]([序号] int,[ID] varchar(1),[NAME] varchar(4)) insert [tbl] select 1,'A','张三' union all select 2,'A','张三' union all select 3,'A','李四' union all select 4,'B','王五' union all select 5,'B','王五' union all select 6,'B','李四' ;with t as( select ROW_NUMBER()over(partition by [ID] order by times desc) as num,* from( select [ID],[NAME],COUNT([NAME]) as times from tbl group by [ID],[NAME])a) update tbl set NAME=(select NAME from t where num=1 and t.ID=tbl.ID) select * from tbl /* 序号 ID NAME 1 A 张三 2 A 张三 3 A 张三 4 B 王五 5 B 王五 6 B 王五 */
------解决方案--------------------
方法有些麻烦,试试吧
CREATE TABLE Table1 ( 序号 INT NOT NULL, ID VARCHAR(10) NOT NULL, Name VARCHAR(10) NOT NULL ) INSERT INTO Table1 SELECT 1,'A','张三' UNION SELECT 2,'A','张三' UNION SELECT 3,'A','李四' UNION SELECT 4,'B','王五' UNION SELECT 5,'B','王五' UNION SELECT 6,'B','李四' UPDATE Table1 SET name = C.MaxName FROM (select A.Id AS MaxId,A.Name AS MaxName from (SELECT ID,Name,COUNT(1) AS Num FROM Table1 GROUP BY ID,Name) AS A where not exists(select 1 from (SELECT ID,Name,COUNT(1) AS Num FROM Table1 GROUP BY ID,Name) AS B where ID = A.Id and Num > A.Num)) AS C WHERE ID = C.MaxId SELECT * FROM table1 /* 1 A 张三 2 A 张三 3 A 张三 4 B 王五 5 B 王五 6 B 王五 */
------解决方案--------------------
create table #users (序号 int, ID varchar(10), NAME varchar(20)) insert into #users(序号,ID,NAME) values (1,'A','张三') insert into #users(序号,ID,NAME) values (2,'A','张三') insert into #users(序号,ID,NAME) values (3,'A','李四') insert into #users(序号,ID,NAME) values (4,'B','王五') insert into #users(序号,ID,NAME) values (5,'B','王五') insert into #users(序号,ID,NAME) values (6,'B','李四') insert into #users(序号,ID,NAME) values (7,'C','赵二') insert into #users(序号,ID,NAME) values (8,'B','李四') ----select * from #users ---drop table #user_select ----统计相同ID不同人名出现次数 select ID,NAME,COUNT(*) as c_n into #user_select from #users group by ID,NAME ----select * from #user_select ----删除 只出现一次的,也就是人名没有异常的数据 delete #user_select from (select ID,COUNT(*) as c_n from #user_select group by id having COUNT(*) = 1) user_only where user_only.id = #user_select.id ----删除 不相同的名字出现的次数相同而且次数都是最大值的数据 ----等下次执行,数据在外部发生变化,出现个数差异的时候再确定以哪一个为准 delete #user_select from (select user_a.id,COUNT(*) as c_n from #user_select user_a, (select ID,MAX(c_n) as c_nmax from #user_select group by id) user_b where user_a.id = user_b.id and user_a.c_n = user_b.c_nmax group by user_a.id having COUNT(*) >1) user_multi where user_multi.id = #user_select.id ----已名字出现最多的次数为准,修改原始表 update #users set NAME = user_update.name from (select user_nmax.id,#user_select.name from (select