有没有更好的写法???

sowinworkTwo 2018-05-31 02:20:34
select A,SUM(D) from
(
select A,B,MAX(D) D from
(
select A,B,C,SUM(D)D FROM tb
group by A,B,C
) T group by A,B
) n group by A
...全文
1083 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
卖水果的net 2018-05-31
  • 打赏
  • 举报
回复
引用 6 楼 yenange 的回复:
[quote=引用 3 楼 sowinworkTwo 的回复:] 去掉中间的B,C就完全错了,业务逻辑都不对了。。。。。。。。。。。。。。。。。。。。。。。。
B, C 先是Group 了, 后来又去掉了再 Group 。 你可以弄数据出来证明我是错的。 [/quote] 不用数据 group by 三列,再取A最大的那行,可能会多行取一个数,如果直接 group by A,就一个总的合计,不存在最大数。
吉普赛的歌 2018-05-31
  • 打赏
  • 举报
回复
引用 9 楼 superwfei 的回复:
[quote=引用 6 楼 yenange 的回复:] [quote=引用 3 楼 sowinworkTwo 的回复:] 去掉中间的B,C就完全错了,业务逻辑都不对了。。。。。。。。。。。。。。。。。。。。。。。。
B, C 先是Group 了, 后来又去掉了再 Group 。 你可以弄数据出来证明我是错的。 [/quote] abc先group,然后取ab不同的数据里d最大的,这个时候忽视c了[/quote] 老顾厉害, 没你这么勤力啊
文盲老顾 2018-05-31
  • 打赏
  • 举报
回复
select a,sum(d) as d from (
	select a,b,sum(d) as d,row_number() over(partition by a,b order by sum(d) desc) as rowid 
	from tb group by a,b,c
) a where rowid=1 group by a
只是减少了一层子查询
文盲老顾 2018-05-31
  • 打赏
  • 举报
回复
引用 6 楼 yenange 的回复:
[quote=引用 3 楼 sowinworkTwo 的回复:] 去掉中间的B,C就完全错了,业务逻辑都不对了。。。。。。。。。。。。。。。。。。。。。。。。
B, C 先是Group 了, 后来又去掉了再 Group 。 你可以弄数据出来证明我是错的。 [/quote] abc先group,然后取ab不同的数据里d最大的,这个时候忽视c了
文盲老顾 2018-05-31
  • 打赏
  • 举报
回复
引用 2 楼 yenange 的回复:
SELECT A,SUM(D) AS D
FROM tb
GROUP BY A
B和C根本没用上, 转了不必要的弯
with tb as (
	select 'a' as a,'b' as b,'c' as c,10 as d
	union all
	select 'a' as a,'b' as b,'c' as c,20 as d
	union all
	select 'a1' as a,'b' as b,'c' as c,20 as d
	union all
	select 'a' as a,'b' as b,'c1' as c,10 as d
	union all
	select 'a' as a,'b' as b,'c1' as c,30 as d
	union all
	select 'a' as a,'b1' as b,'c1' as c,30 as d
)
--select a,b,c,sum(d) as d from tb group by a,b,c
SELECT A,SUM(D) AS D
FROM tb
GROUP BY A

A    D
---- -----------
a    100
a1   20

(2 行受影响)


select a,sum(d) as d from (
	select a,max(d) as d from (
		select a,b,sum(d) as d from tb group by a,b,c
	) a group by a,b
) a group by a

a    d
---- -----------
a    70
a1   20

(2 行受影响)

select a,sum(d) as d from (
	select a,b,sum(d) as d,row_number() over(partition by a,b order by sum(d) desc) as rowid 
	from tb group by a,b,c
) a where rowid=1 group by a

a    d
---- -----------
a    70
a1   20

(2 行受影响)

吉普赛的歌 2018-05-31
  • 打赏
  • 举报
回复
引用 3 楼 sowinworkTwo 的回复:
去掉中间的B,C就完全错了,业务逻辑都不对了。。。。。。。。。。。。。。。。。。。。。。。。
B, C 先是Group 了, 后来又去掉了再 Group 。 你可以弄数据出来证明我是错的。
卖水果的net 2018-05-31
  • 打赏
  • 举报
回复
目前,你的写法是最好的写法了。用 CTE 看起来更舒服一些。
sowinworkTwo 2018-05-31
  • 打赏
  • 举报
回复
去掉中间的B,C就完全错了,业务逻辑都不对了。。。。。。。。。。。。。。。。。。。。。。。。
sowinworkTwo 2018-05-31
  • 打赏
  • 举报
回复
用CTE更优雅点,也更简明,可能是唯一的选项罗。
吉普赛的歌 2018-05-31
  • 打赏
  • 举报
回复
SELECT A,SUM(D) AS D
FROM tb
GROUP BY A
B和C根本没用上, 转了不必要的弯
zhaoanle 2018-05-31
  • 打赏
  • 举报
回复
;with a1 as ( select A,B,C,SUM(D)D FROM tb group by A,B,C), a2 as (select A,B,MAX(D) D from a1) select A,SUM(D) from a2

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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