请教各位一个问题,谢谢了!

[复制链接]
查看11 | 回复8 | 2007-1-6 21:14:12 | 显示全部楼层 |阅读模式
数据库中的数据如下:
ID 币种金额
1
USD
100.00
1
RMB
200.00
1
HKD
300.00
1
SGD
400.00
1
EUR
500.00
1
USD
100.00
2
RMB
200.00
2
HKD
300.00
3
SGD
400.00
4
EUR
500.00
5
USD
100.00
5
RMB
200.00
5
HKD
300.00
6
SGD
400.00
6
EUR
500.00
我想通过sql语句转换成如下样子:
ID美元币种金额
也就是说,在美元的时候,将币种为USD的金额旋转一下,其它非USD的就不用旋转了。
目前我通过Union可以做成如下样子:
1
200

1
EUR
500
1
HKD
300
1
RMB
200
1
SGD
400
2
HKD
300
2
RMB
200
3
SGD
400
4
EUR
500
5
100

5
HKD
300
5
RMB
200
6
EUR
500
6
SGD
400
请问,应该如何写sql语句,将结果处理成如下样子:
ID美元 币种 金额
1200 EUR 500
1
HKD
300
1
RMB
200
1
SGD
400
2
HKD
300
2
RMB
200
3
SGD
400
4
EUR
500
5100 HKD 300
5
RMB
200
6
EUR
500
6
SGD
400
回复

使用道具 举报

千问 | 2007-1-6 21:14:12 | 显示全部楼层
什么是旋转一下?没怎么看懂
回复

使用道具 举报

千问 | 2007-1-6 21:14:12 | 显示全部楼层
需求不难,不过先给出建表语句和测试数据。
回复

使用道具 举报

千问 | 2007-1-6 21:14:12 | 显示全部楼层
见附件![直接放代码不行!]
[ 本帖最后由 bell6248 于 2007-11-20 13:35 编辑 ]
回复

使用道具 举报

千问 | 2007-1-6 21:14:12 | 显示全部楼层
非常感谢
你写出的代码真是我所需要的
现在唯一要担心的就是效率问题了,不过这个我应该能自己解决了,谢谢!
回复

使用道具 举报

千问 | 2007-1-6 21:14:12 | 显示全部楼层
SQL> select * from test;
ID BZ
JE
---------- --- ----------
1 USD100
1 RMB200
1 HKD300
1 SGD400
1 EUR500
1 USD100
2 RMB200
2 HKD300
3 SGD400
4 EUR500
5 USD100
5 RMB200
5 HKD300
6 SGD400
6 EUR500
15 rows selected.
[PHP]
SQL> select id,decode(nn,'0USD',mm,NULL) 美元,bz 币种,je 金额
2from (select id,bz,je,
3
lAG(je) over (partition by id order by bz) mm,
4
lAG(bz) over (partition by id order by bz) nn
5
from (select id,decode(bz,'USD','0'||bz,bz) bz,sum(je) je
6
from test
7
groupby id,bz))
8wherebz!='0USD';
ID 美元 币种 金额
---------- ---------- ---- ----------
1200 EUR 500
1
HKD 300
1
RMB 200
1
SGD 400
2
HKD 300
2
RMB 200
3
SGD 400
4
EUR 500
5100 HKD 300
5
RMB 200
6
EUR 500
6
SGD 400
12 rows selected.
.
[/PHP]
[ 本帖最后由 atgc 于 2007-11-20 14:09 编辑 ]
回复

使用道具 举报

千问 | 2007-1-6 21:14:12 | 显示全部楼层
原帖由 floatyzq 于 2007-11-20 14:04 发表
非常感谢
你写出的代码真是我所需要的
现在唯一要担心的就是效率问题了,不过这个我应该能自己解决了,谢谢!


关于效率, 应该还不错!


回复

使用道具 举报

千问 | 2007-1-6 21:14:12 | 显示全部楼层
原帖由 bell6248 于 2007-11-20 13:29 发表
见附件![直接放代码不行!]

根据bell6248大哥的代码,我试了一下同时将USD、RMB、HKD同时旋转的代码如下,如果需要更多,一次类推即可:
select *
from (select id,

lag(dollars, 1) over(order by id, DOLLARS nulls last) dollars,

lag(rmbs, 1) over(order by id, rmbs nulls last) rmbs,

lag(HKDS, 1) over(order by id, HKDS nulls last) eurs,

kind,

amount

from (select id,

sum(dollars) dollars,

sum(RMB) rmbs,

sum(HKD) HKDS,

KIND,

sum(amount) amount

from (select id,

decode(KIND, 'USD', amount, null) dollars,

decode(KIND, 'RMB', amount, null) RMB,

decode(KIND, 'HKD', amount, null) HKD,

decode(KIND,

'USD',

null,

'RMB',

null,

'HKD',

null,

KIND) KIND,

amount

from temp1)

group by id, KIND))
where kind is not null
回复

使用道具 举报

千问 | 2007-1-6 21:14:12 | 显示全部楼层
原帖由 atgc 于 2007-11-20 14:06 发表
SQL> select * from test;
ID BZ
JE
---------- --- ----------
1 USD100
1 RMB200
1 HKD300
1 SGD400
...

根据atgc的给出的代码,我尝试了一下将USD、RMB、HKD同时旋转的写法如下所示,稍微麻烦了点^_^
需要注意使用分析函数lag时的顺序问题,这个跟最后一步的dedoce中的计算应该刚好是逆序的
select id,
decode(bz3, '0USD', je3, null),
decode(bz2, '1HKD', je2, null),
decode(bz1, '2RMB', je1, null),
bz,
je
from (select id,

bz,

je,

lAG(je, 1) over(partition by id order by bz) je1,

lAG(bz, 1) over(partition by id order by bz) bz1,

lag(je, 2) over(partition by id order by bz) je2,

lag(bz, 2) over(partition by id order by bz) bz2,

lag(je, 3) over(partition by id order by bz) je3,

lag(bz, 3) over(partition by id order by bz) bz3

from (select id,

decode(bz,

'USD',

'0' || bz,

'HKD',

'1' || bz,

'RMB',

'2' || bz,

bz) bz,

sum(je) je

from test

group by id, bz

order by bz))
where bz not in ('0USD', '1HKD', '2RMB')
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行