请教一个批量调整数据的SQL语句! 高手来

learnall 2004-10-14 06:02:54
select id,name,area,birthday,sex,email,Memo from tb
结果是:
id name area birthday sex email memo
1 张三 北京 1980-01-01 自由人
2 张三 北京 男 aa@263.net 自由
....

我需要将 name,area一样的字段记录 合并成一条,并且当第一条字段为空时,第二条记录相应字段自动填充

形成最后结果为:

id name area birthday sex email memo
1 张三 北京 1980-01-01 男 aa@263.net 自由人

这样的记录很多,怎样写SQL 语句 批量完成这样的数据库操作?
...全文
115 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2004-10-14
  • 打赏
  • 举报
回复
--如果还要考虑 birthday 最大的会重复,则:
select a.* from tb a
where not exists(
select * from tb
where name=a.name and area=a.area
and(birthday>a.birthday or birthday=a.birthday and id>a.id))

--或者是这样
select a.*
from tb a,(
select id=max(id) --假设id为主键
from tb a,(
select birthday=max(birthday),name,area
from tb group by name,area
)b where a.name=b.name and a.area=b.area and a.birthday=b.birthday
group by a.name,a.area,a.birthday
)b where a.id=b.id
zjcxc 元老 2004-10-14
  • 打赏
  • 举报
回复

--或者是这样
select a.*
from tb a,(
select birthday=max(birthday),name,area
from tb group by name,area
)b where a.name=b.name and a.area=b.area and a.birthday=b.birthday
zjcxc 元老 2004-10-14
  • 打赏
  • 举报
回复
--如果以 birthday 日期大的为准 ,则就这样写就行了

select a.* from tb a
where not exists(
select * from tb where name=a.name and area=a.area and birthday>a.birthday)
zjcxc 元老 2004-10-14
  • 打赏
  • 举报
回复
如果合并的处理没有严格要求是第一个非空的,建议用 victorycyz(中海) 的这种合并方式,这样的效率高
learnall 2004-10-14
  • 打赏
  • 举报
回复
zjcxc(邹建) :
还有更优化的方法么? 如果不以第一条为准,以记录中birthday 日期大的为准呢?
如:
id name area birthday sex email memo
1 张三 北京 1980-01-01 自由人
2 张三 北京 1981-01-01 男 自由
10 张三 北京 1979-01-01 男 aa@263.net 自由2

结果:
id name area birthday sex email memo
1 张三 北京 1981-01-01 男 aa@263.net 自由
victorycyz 2004-10-14
  • 打赏
  • 举报
回复
select min(id),name,area,max(birthday),max(sex),max(email),max(memo)
from tb
group by name,erea
learnall 2004-10-14
  • 打赏
  • 举报
回复
而且 又可能name,area相同的记录会是3个, 但是合并的原则一样
zjcxc 元老 2004-10-14
  • 打赏
  • 举报
回复
select *
,birthday=(select top 1 birthday from tb where name=a.name and area=a.area and isnull(birthday,'')<>'')
,sex=(select top 1 sex from tb where name=a.name and area=a.area and isnull(sex,'')<>'')
,email=(select top 1 email from tb where name=a.name and area=a.area and isnull(email,'')<>'')
,Memo=(select top 1 Memo from tb where name=a.name and area=a.area and isnull(Memo,'')<>'')
from(
select id=min(id),name,area
from tb
group by name,area
)a
learnall 2004-10-14
  • 打赏
  • 举报
回复
对的! 只有空的字段用下一条name,area相同的记录代替,非空的字段保留

注:name,area相同的记录 id 不一定相邻,
也就是说,有可能一个id 是1, 另一个id是10
需要先找出 name,area相同的 然后再合并

不知道我解释清楚了么?
zjcxc 元老 2004-10-14
  • 打赏
  • 举报
回复
合并怎么取舍? 空的字段用第二条的去代替,非空的呢?

是否合并规则是这样的?

name,area 相同的合并,其他字段保留第一条非空的记录?

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧