一个难写的SQL语句

玉生香 2020-07-09 06:45:57
有没有办法将框起来的两行合并成一行 将scount 进行求和

...全文
477 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
CHQIUU 2020-07-17
  • 打赏
  • 举报
回复
你看这是你想要的不?? 原始数据: 执行语句:
SELECT a.sneid,a.tneid,a.asneid,a.atneid,a.scount+b.scount FROM t AS a 
INNER JOIN t AS b on a.sneid=b.sneid and a.tneid=b.tneid and a.asneid=b.atneid and a.atneid=b.asneid
GROUP BY a.sneid,a.tneid
执行结果:
JesperMax 2020-07-12
  • 打赏
  • 举报
回复

select d.id,d.sneid,d.tneid,d.asneid,d.atneid,d.scount from (select c.*,row_number() over(partition by sneid,tneid) rn from (select a.id,a.sneid,a.tneid,a.asneid,a.atneid,a.scount+b.scount scount from t1 a inner join t1 b on a.sneid=b.sneid and a.tneid=b.tneid and a.asneid=b.atneid and a.atneid=b.asneid) c) d where rn=1
union all
select c.id,c.sneid,c.tneid,c.asneid,c.atneid,c.scount from (select a.id,a.sneid,a.tneid,a.asneid,a.atneid,a.scount, b.id c1 from t1 a left join t1 b on a.sneid=b.sneid and a.tneid=b.tneid and a.asneid=b.atneid and a.atneid=b.asneid)c where c1 is null;
满足要求吗?
JesperMax 2020-07-12
  • 打赏
  • 举报
回复
引用 8 楼 玉生香 的回复:
[quote=引用 7 楼 向阳的花儿 的回复:]你只是把结果筛出来了,你是根据什么样的逻辑决定两条中留的是那一条?为什么不是另外一条。 你要把逻辑表达清楚的
两条任意一条都可以,只要把结果sum起来。[/quote] 不能相加的数据要保留在结果中吧?
胖到没有朋友 2020-07-10
  • 打赏
  • 举报
回复
引用 8 楼 玉生香的回复:
[quote=引用 7 楼 向阳的花儿 的回复:]你只是把结果筛出来了,你是根据什么样的逻辑决定两条中留的是那一条?为什么不是另外一条。 你要把逻辑表达清楚的
两条任意一条都可以,只要把结果sum起来。[/quote] 我只截图了里面的sql是让你看筛选出来的数据对不对
胖到没有朋友 2020-07-10
  • 打赏
  • 举报
回复
引用 8 楼 玉生香的回复:
[quote=引用 7 楼 向阳的花儿 的回复:]你只是把结果筛出来了,你是根据什么样的逻辑决定两条中留的是那一条?为什么不是另外一条。 你要把逻辑表达清楚的
两条任意一条都可以,只要把结果sum起来。[/quote] 那你把我上面的语句查询的多加两个字段就行了,我截图只截图了里面的sql,外面的sql你写上执行出来就是右边的结果啊。
胖到没有朋友 2020-07-10
  • 打赏
  • 举报
回复
引用 8 楼 玉生香的回复:
[quote=引用 7 楼 向阳的花儿 的回复:]你只是把结果筛出来了,你是根据什么样的逻辑决定两条中留的是那一条?为什么不是另外一条。 你要把逻辑表达清楚的
两条任意一条都可以,只要把结果sum起来。[/quote] 那你把我上面的语句查询的多加两个字段就行了,我截图只截图了里面的sql,外面的sql你写上执行出来就是右边的结果啊。
玉生香 2020-07-10
  • 打赏
  • 举报
回复
引用 7 楼 向阳的花儿 的回复:
你只是把结果筛出来了,你是根据什么样的逻辑决定两条中留的是那一条?为什么不是另外一条。 你要把逻辑表达清楚的
两条任意一条都可以,只要把结果sum起来。
向阳的花儿 2020-07-10
  • 打赏
  • 举报
回复
你只是把结果筛出来了,你是根据什么样的逻辑决定两条中留的是那一条?为什么不是另外一条。 你要把逻辑表达清楚的
玉生香 2020-07-10
  • 打赏
  • 举报
回复
引用 3 楼 胖到没有朋友 的回复:
[quote=引用 2 楼 玉生香 的回复:][quote=引用 1 楼 大雨将至 的回复:]规则没说清,如果只是分组求和 select sum(scount) from t group by sneid,tneid
这么简单,肯定不发到论坛上来浪费大神的时间。 sneid tnie 是固定分组,asneid,atneid两行,数据刚好相反, 把它们加起来。 比如第一个红框的结果 sneid tnie asneid atneid scount 189-1067 9-1031 189-1067 9-22 3 [/quote] 根据条件自关联,把满足条件的在groupby[/quote] 想要这样的结果
玉生香 2020-07-10
  • 打赏
  • 举报
回复
引用 4 楼 向阳的花儿 的回复:
两行是不一样的,合并之后取哪一行呢?
合并后想要这样的结果
向阳的花儿 2020-07-10
  • 打赏
  • 举报
回复
两行是不一样的,合并之后取哪一行呢?
胖到没有朋友 2020-07-10
  • 打赏
  • 举报
回复
引用 2 楼 玉生香 的回复:
[quote=引用 1 楼 大雨将至 的回复:]规则没说清,如果只是分组求和 select sum(scount) from t group by sneid,tneid
这么简单,肯定不发到论坛上来浪费大神的时间。 sneid tnie 是固定分组,asneid,atneid两行,数据刚好相反, 把它们加起来。 比如第一个红框的结果 sneid tnie asneid atneid scount 189-1067 9-1031 189-1067 9-22 3 [/quote] 根据条件自关联,把满足条件的在groupby
玉生香 2020-07-10
  • 打赏
  • 举报
回复
引用 1 楼 大雨将至 的回复:
规则没说清,如果只是分组求和 select sum(scount) from t group by sneid,tneid
这么简单,肯定不发到论坛上来浪费大神的时间。 sneid tnie 是固定分组,asneid,atneid两行,数据刚好相反, 把它们加起来。 比如第一个红框的结果 sneid tnie asneid atneid scount 189-1067 9-1031 189-1067 9-22 3
大雨将至 2020-07-10
  • 打赏
  • 举报
回复
规则没说清,如果只是分组求和 select sum(scount) from t group by sneid,tneid
向阳的花儿 2020-07-10
  • 打赏
  • 举报
回复
如果不是多行,有以下两种建议 第一:借助其他行,看是否能再次区分 第二:将表数据放入中间行,将一组的asneid更新,然后取Distinct,分组按照sneid,tneid,asneid
引用 15 楼 玉生香 的回复:
[quote=引用 12 楼 向阳的花儿 的回复:] 嗯嗯,那3楼的说法就是对的了。如果同样的sneid,tneid只会有两行的话,可以排序,只取第一个
select * from (
select a.sneid,a.tneid,a.asneid,a.atneid,a.scount+b.scount as count1,
ROW_NUMBER() over(partition by a.sneid,a.tneid order by getdate()) as n from ysx as a
inner join ysx as b on a.sneid=b.sneid and a.tneid=b.tneid and a.asneid=b.atneid and a.atneid=b.asneid 
) a where n=1 
[quote=引用 8 楼 玉生香 的回复:][quote=引用 7 楼 向阳的花儿 的回复:]你只是把结果筛出来了,你是根据什么样的逻辑决定两条中留的是那一条?为什么不是另外一条。 你要把逻辑表达清楚的
两条任意一条都可以,只要把结果sum起来。[/quote][/quote] sneid,tneid 有多行 sneid,tneid,asneid,atneid 这样的两行 [/quote]
带我飞的云 2020-07-10
  • 打赏
  • 举报
回复
select * from (
select a.sneid,a.tneid,a.asneid,a.atneid,a.scount+b.scount as count1,
ROW_NUMBER() over(partition by a.sneid,a.tneid order by getdate()) as n from ysx as a
inner join ysx as b on a.sneid=b.sneid and a.tneid=b.tneid and a.asneid=b.atneid and a.atneid=b.asneid 
) a where n=1 
玉生香 2020-07-10
  • 打赏
  • 举报
回复
引用 12 楼 向阳的花儿 的回复:
嗯嗯,那3楼的说法就是对的了。如果同样的sneid,tneid只会有两行的话,可以排序,只取第一个
select * from (
select a.sneid,a.tneid,a.asneid,a.atneid,a.scount+b.scount as count1,
ROW_NUMBER() over(partition by a.sneid,a.tneid order by getdate()) as n from ysx as a
inner join ysx as b on a.sneid=b.sneid and a.tneid=b.tneid and a.asneid=b.atneid and a.atneid=b.asneid 
) a where n=1 
[quote=引用 8 楼 玉生香 的回复:][quote=引用 7 楼 向阳的花儿 的回复:]你只是把结果筛出来了,你是根据什么样的逻辑决定两条中留的是那一条?为什么不是另外一条。 你要把逻辑表达清楚的
两条任意一条都可以,只要把结果sum起来。[/quote][/quote] sneid,tneid 有多行 sneid,tneid,asneid,atneid 这样的两行
玉生香 2020-07-10
  • 打赏
  • 举报
回复
引用 13 楼 Army_Adviser_ 的回复:
提供个思路 看看能不能做判断 新增一列 然后做group 我以前都是这样做的。
没有理解。!!
李牧大将军 2020-07-10
  • 打赏
  • 举报
回复
提供个思路 看看能不能做判断 新增一列 然后做group 我以前都是这样做的。
向阳的花儿 2020-07-10
  • 打赏
  • 举报
回复
嗯嗯,那3楼的说法就是对的了。如果同样的sneid,tneid只会有两行的话,可以排序,只取第一个
select * from (
select a.sneid,a.tneid,a.asneid,a.atneid,a.scount+b.scount as count1,
ROW_NUMBER() over(partition by a.sneid,a.tneid order by getdate()) as n from ysx as a
inner join ysx as b on a.sneid=b.sneid and a.tneid=b.tneid and a.asneid=b.atneid and a.atneid=b.asneid 
) a where n=1 
引用 8 楼 玉生香 的回复:
[quote=引用 7 楼 向阳的花儿 的回复:]你只是把结果筛出来了,你是根据什么样的逻辑决定两条中留的是那一条?为什么不是另外一条。 你要把逻辑表达清楚的
两条任意一条都可以,只要把结果sum起来。[/quote]

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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