查看: 6643|回复: 15

[SQL] 【讨论】如何进行部分列去重汇总的问题

[复制链接]
招聘 : 数据库开发
论坛徽章:
1
优秀写手
日期:2014-06-17 06:00:12
发表于 2014-6-13 14:52 | 显示全部楼层 |阅读模式
因为是多个表进行连接后再汇总,导致数据出现了一些重复。一直想不出怎么解决。
简化了很多。
create table t_group
(
subj        varchar(5),
amt         number(12,2),
newrownum   number(6),
corpus      number(12,2)
)
insert into t_group values('CP',1000,1,500);
insert into t_group values('CP',1000,1,600);
insert into t_group values('CP',200,2,20);
insert into t_group values('CP',200,3,10);
insert into t_group values('CU',2080,5,300);
insert into t_group values('CU',1200,6,20);


amt的汇总是要经过过滤,而cropus的汇总不进行去重
想要的结果是
subj  amt   corpus
CP   1400  1130
CU   3280  320


论坛徽章:
403
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2014-6-13 15:10 来自手机 | 显示全部楼层
没看到重复

使用道具 举报

回复
招聘 : 数据库开发
论坛徽章:
1
优秀写手
日期:2014-06-17 06:00:12
 楼主| 发表于 2014-6-13 15:14 | 显示全部楼层
前两行的amt+newrownum重复的。并不是所有字段重复,麻烦就麻烦在这里。不能简单的group

使用道具 举报

回复
论坛徽章:
7
问答徽章
日期:2013-12-13 14:31:59雪铁龙
日期:2013-12-20 17:35:49劳斯莱斯
日期:2014-02-10 11:17:26奥迪
日期:2014-02-19 09:39:33马上加薪
日期:2014-04-25 21:52:252014年世界杯参赛球队: 法国
日期:2014-05-29 19:33:422014年世界杯参赛球队: 美国
日期:2014-07-30 11:33:36
发表于 2014-6-13 15:15 | 显示全部楼层
SELECT subj,SUM(CASE WHEN rn=1 THEN amt END),SUM(corpus)
FROM (SELECT subj,amt,newrownum,corpus,
             row_number()OVER(PARTITION BY subj,newrownum ORDER BY newrownum) rn
           FROM t_group)
GROUP BY subj;

使用道具 举报

回复
招聘 : 数据库开发
论坛徽章:
1
优秀写手
日期:2014-06-17 06:00:12
 楼主| 发表于 2014-6-13 15:19 | 显示全部楼层
try了嘛,貌似不是想要的结果

使用道具 举报

回复
论坛徽章:
310
生肖徽章:鼠
日期:2014-08-07 19:59:00生肖徽章:牛
日期:2015-01-14 17:40:00生肖徽章:虎
日期:2014-11-05 19:45:02生肖徽章:兔
日期:2015-03-05 07:52:09生肖徽章:龙
日期:2015-03-05 07:53:59生肖徽章:蛇
日期:2014-08-28 11:56:51生肖徽章:马
日期:2014-11-04 20:19:57生肖徽章:羊
日期:2015-01-09 15:48:14生肖徽章:猴
日期:2015-02-04 16:57:45生肖徽章:鸡
日期:2014-09-05 20:35:13
发表于 2014-6-13 15:20 | 显示全部楼层
想到了ROW_NUMBER(),却写出这么个语句......

SELECT T.SUBJ SUBJ, T1.S_AMT, T.S_CORPUS
  FROM (SELECT SUBJ, SUM(CORPUS) S_CORPUS FROM T_GROUP T GROUP BY SUBJ) T,
       (SELECT SUBJ, SUM(AMT) S_AMT
          FROM (SELECT SUBJ,
                       AMT,
                       ROW_NUMBER() OVER(PARTITION BY SUBJ, NEWROWNUM ORDER BY NEWROWNUM) RN
                  FROM T_GROUP T)
         WHERE RN = 1
         GROUP BY SUBJ) T1
WHERE T.SUBJ = T1.SUBJ;

使用道具 举报

回复
招聘 : 数据库开发
论坛徽章:
1
优秀写手
日期:2014-06-17 06:00:12
 楼主| 发表于 2014-6-13 15:21 | 显示全部楼层
wang138699 发表于 2014-6-13 15:15
SELECT subj,SUM(CASE WHEN rn=1 THEN amt END),SUM(corpus)
FROM (SELECT subj,amt,newrownum,corpus,
...

看来只能这样了,用嵌套group,赞一个

使用道具 举报

回复
认证徽章
论坛徽章:
169
SQL数据库编程大师
日期:2016-01-13 10:30:43SQL极客
日期:2013-12-09 14:13:35SQL大赛参与纪念
日期:2013-12-06 14:03:45最佳人气徽章
日期:2015-03-19 09:44:03现任管理团队成员
日期:2015-08-26 02:10:00秀才
日期:2015-07-28 09:12:12举人
日期:2015-07-13 15:30:15进士
日期:2015-07-28 09:12:58探花
日期:2015-07-28 09:12:58榜眼
日期:2015-08-18 09:48:03
发表于 2014-6-13 15:30 | 显示全部楼层
select SUBJ,SUM(CORPUS),SUM(CASE WHEN RN=1 THEN AMT END) from (
select T.*,ROW_NUMBER() over(partition by SUBJ,NEWROWNUM order by NEWROWNUM) RN from T_GROUP T ) T2
GROUP BY SUBJ

使用道具 举报

回复
认证徽章
论坛徽章:
135
玉石琵琶
日期:2014-07-02 10:11:04九尾狐狸
日期:2014-07-02 10:11:04紫蜘蛛
日期:2014-07-02 10:11:04蓝色妖姬
日期:2014-07-02 10:11:04蓝色妖姬
日期:2014-08-28 15:17:25马上加薪
日期:2014-08-07 12:47:01马上加薪
日期:2014-07-23 11:55:37马上加薪
日期:2014-07-21 16:24:17马上加薪
日期:2014-07-17 17:01:52马上加薪
日期:2014-07-17 16:15:19
发表于 2014-6-13 15:43 | 显示全部楼层

select subj,sum(amt),sum(corpus) from (
select a.subj,a.amt,sum(corpus) corpus from t_group a group by  a.subj,a.newrownum,a.amt)
group by subj

使用道具 举报

回复
招聘 : 数据库开发
论坛徽章:
1
优秀写手
日期:2014-06-17 06:00:12
 楼主| 发表于 2014-6-13 15:56 | 显示全部楼层
ri6789 发表于 2014-6-13 15:43
select subj,sum(amt),sum(corpus) from (
select a.subj,a.amt,sum(corpus) corpus from t_group a gro ...

这个方法确实不错,偶有时候就是钻牛角尖了。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表