表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语句该如何来写?
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