表TEST如下:
A B C D E F G
2 5 2 991 128 1656 100
2 6 21 990 127 1656 100
2 7 35 861 95 574 100
3 8 2 991 128 1656 100
2 9 35 861 95 574 100
1 5 21 990 127 1656 100
1 3 35 861 95 574 100
2 2 35 861 95 574 100
3 1 21 990 127 1656 100
3 3 35 861 95 574 100
3 2 61 1325 74 864 100
1 1 61 1325 74 864 100
1 7 2 991 128 1656 100
现在要求对C, D, E, F 这4个字段相同的值分组排序,然后根据A字段的值进行合并
也就是说假如我运行如下语句:
select * from (select C, D, E, F, (Count(*)) As Num from TEST group by C, D, E, F) t where Num > 1 的话,会产生一个这样的结果
C D E F Num
2 991 128 1656 3
21 990 127 1656 3
35 861 95 574 5
61 1325 74 864 2
也就是会有4个组,然后接下来就是对这4个组根据A字段的值进行行合并,也就是说假如先看
C D E F Num
2 991 128 1656 3
这一行的分组是
A B C D E F G
2 5 2 991 128 1656 100
3 8 2 991 128 1656 100
1 7 2 991 128 1656 100
3条的情况,而合并的规则是对A字段为1的行取B,C,D,E的值,对为3的行取G的值,而F的值则是每行F字段的累加值
也就是(1656+1656+1656=4968)
最后把这一行新行产生以后更新A字段的值为5然后插入原表,
即是:A B C D E F G
5 7 2 991 128 4968 100
一共会有4条新行产生,不知道我表达得清楚不,请大家指导
这样的SQL语句该如何来写?
A B C D E F G
2 5 2 991 128 1656 100
2 6 21 990 127 1656 100
2 7 35 861 95 574 100
3 8 2 991 128 1656 100
2 9 35 861 95 574 100
1 5 21 990 127 1656 100
1 3 35 861 95 574 100
2 2 35 861 95 574 100
3 1 21 990 127 1656 100
3 3 35 861 95 574 100
3 2 61 1325 74 864 100
1 1 61 1325 74 864 100
1 7 2 991 128 1656 100
现在要求对C, D, E, F 这4个字段相同的值分组排序,然后根据A字段的值进行合并
也就是说假如我运行如下语句:
select * from (select C, D, E, F, (Count(*)) As Num from TEST group by C, D, E, F) t where Num > 1 的话,会产生一个这样的结果
C D E F Num
2 991 128 1656 3
21 990 127 1656 3
35 861 95 574 5
61 1325 74 864 2
也就是会有4个组,然后接下来就是对这4个组根据A字段的值进行行合并,也就是说假如先看
C D E F Num
2 991 128 1656 3
这一行的分组是
A B C D E F G
2 5 2 991 128 1656 100
3 8 2 991 128 1656 100
1 7 2 991 128 1656 100
3条的情况,而合并的规则是对A字段为1的行取B,C,D,E的值,对为3的行取G的值,而F的值则是每行F字段的累加值
也就是(1656+1656+1656=4968)
最后把这一行新行产生以后更新A字段的值为5然后插入原表,
即是:A B C D E F G
5 7 2 991 128 4968 100
一共会有4条新行产生,不知道我表达得清楚不,请大家指导
这样的SQL语句该如何来写?
解决方案 »
- 怎么通过JDBC读取数据库的注释,表的注释
- 改变datafile 的 SCN
- 关于字符集的问题,我往表插入数据的时候中文可以显示,但是过程写备注的时候却显示乱码
- solaris10下的oracle10g服务的启动
- 【觅秘】请问一下在客户段PL/SQL中DML语句(INSERT/UPDATE/DELETE),经办时间是以服务器时间计入系统数据库,还是以客户端时间计入系统数据库??
- 关于oracle建立子表的数据导入
- 如何取某列中多行相同值中的一行数据?
- sqlplus输出字段名不全是什么原因?
- 可以导出视图中的数据吗?
- 这个UPDATE语句如何写?
- 想查看一个帐户里有哪些表,应该使用哪个语句来查询?
- execute immediate update 缺失 SET 关键字 的问题
sum(f) over() f ,
max(decode(a,3,g,0)) g
from test
group by c,d,f
你的a最后为什么会等于5 描述的还是不清楚
把你想要的结果,按你的测试数据贴出来
A B C D E F G
2 5 2 991 128 1656 100
3 8 2 991 128 1656 100
1 7 2 991 128 1656 100
5 7 2 991 128 4968 100
这是一条2 6 21 990 127 1656 100
1 5 21 990 127 1656 100
3 1 21 990 127 1656 100
5 5 21 990 127 4968 100
这是一条2 7 35 861 95 574 100
2 9 35 861 95 574 100
1 3 35 861 95 574 100
2 2 35 861 95 574 100
3 3 35 861 95 574 100
5 3 35 861 95 2870 100
这是一条3 2 61 1325 74 864 100
1 1 61 1325 74 864 100
5 1 61 1325 74 1728 100
这是一条所以一共会产生4条新行在原来的表里,至于a最后为什么会等于5,也就是把新行的A字段值写成5就可以了
还有,你a是否肯定每个会出现1和3,你f也就说只有同组的才加在一起的
sql要改一下lect 5 a,max(decode(a,1,b,0)) b,c,d,e,
sum(f) over(partition by c,d,e,f) f ,
max(decode(a,3,g,0)) g
from test
group by c,d,e,f
(SELECT 2 a, 5 b, 2 c, 991 d, 128 e, 1656 f, 100 g
FROM DUAL
UNION ALL
SELECT 2, 6, 21, 990, 127, 1656, 100
FROM DUAL
UNION ALL
SELECT 2, 7, 35, 861, 95, 574, 100
FROM DUAL
UNION ALL
SELECT 3, 8, 2, 991, 128, 1656, 100
FROM DUAL
UNION ALL
SELECT 2, 9, 35, 861, 95, 574, 100
FROM DUAL
UNION ALL
SELECT 1, 5, 21, 990, 127, 1656, 100
FROM DUAL
UNION ALL
SELECT 1, 3, 35, 861, 95, 574, 100
FROM DUAL
UNION ALL
SELECT 2, 2, 35, 861, 95, 574, 100
FROM DUAL
UNION ALL
SELECT 3, 1, 21, 990, 127, 1656, 100
FROM DUAL
UNION ALL
SELECT 3, 3, 35, 861, 95, 574, 100
FROM DUAL
UNION ALL
SELECT 3, 2, 61, 1325, 74, 864, 100
FROM DUAL
UNION ALL
SELECT 1, 1, 61, 1325, 74, 864, 100
FROM DUAL
UNION ALL
SELECT 1, 7, 2, 991, 128, 1656, 100
FROM DUAL)
SELECT 5 a, MAX (DECODE (a, 1, b, 0)) b, c, d, e,
SUM (f) OVER (PARTITION BY c, d, e, f) f, MAX (DECODE (a,
3, g,
0
)) g
FROM TEST
GROUP BY c, d, e, f结果
Row# A B C D E F G1 5 7 2 991 128 1656 100
2 5 5 21 990 127 1656 100
3 5 3 35 861 95 574 100
4 5 1 61 1325 74 864 100
看看是不是你婪的
应该
SELECT 5 a, MAX (DECODE (a, 1, b, 0)) b, c, d, e,
SUM (f) f, MAX (DECODE (a,
3, g,
0
)) g
FROM TEST
GROUP BY c, d, e, f结果
Row# A B C D E F G1 5 5 21 990 127 4968 100
2 5 1 61 1325 74 1728 100
3 5 7 2 991 128 4968 100
4 5 3 35 861 95 2870 100