急!一个行列转换统计的问题

hant 2005-11-14 03:50:17
Question1:有如下的表格记录
单位名称 税种 金额
单位A 营业税 10.2
单位B 营业税 20.2
单位A 增值税 11.1
单位B 增值税 22.3
单位C 增值税 12.5
单位C 印花税 21.5

希望查询出来的统计信息为:
单位名称 合计 营业税 增值税 印花税
单位A 23.3 10.2 11.1 0
单位B 42.5 20.2 22.3 0
单位C 34.0 0 12.5 21.5
合计 99.8 30.4 47.9 21.5

其统计目的,就是希望通过税种和单位进行分类统计汇总。单位和税种都是变长条件。
其中涉及到行列转换,自己搞了半天,几种方法试了试都不是很理想,希望大家能够给点解决的办法,谢谢了
...全文
160 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
my314 2005-11-17
  • 打赏
  • 举报
回复
最近在论坛上,经常会看到关于分组后字段拼接的问题,
大概是类似下列的情形:
SQL> select no,q from test
2 /

NO Q
---------- ------------------------------
001 n1
001 n2
001 n3
001 n4
001 n5
002 m1
003 t1
003 t2
003 t3
003 t4
003 t5
003 t6

12 rows selected

最后要得到类似于如下的结果:
001 n1;n2;n3;n4;n5
002 m1
003 t1;t2;t3;t4;t5;t6

通常大家都认为这类问题无法用一句SQL解决,本来我也这么认为,可是今天无意中突然有了灵感,原来是可以这么做的:
前几天有人提到过sys_connect_by_path的用法,我想这里是不是也能用到这个方法,如果能做到的话,不用函数或存贮过程也可以做到了;要用到sys_connect_by_path,首先要自己构建树型的结构,并且树的每个分支都是单根的,例如1-〉2-〉3-〉4,不会存在1-〉2,1-〉3的情况;
我是这么构建树,很简单的,看下面的结果就会知道了:
SQL> select no,q,rn,lead(rn) over(partition by no order by rn) rn1
2 from (select no,q,row_number() over(order by no,q desc) rn from test)
3 /

NO Q RN RN1
---------- ------------------------------ ---------- ----------
001 n5 1 2
001 n4 2 3
001 n3 3 4
001 n2 4 5
001 n1 5
002 m1 6
003 t6 7 8
003 t5 8 9
003 t4 9 10
003 t3 10 11
003 t2 11 12
003 t1 12

12 rows selected

有了这个树型的结构,接下来的事就好办了,只要取出拥有全路径的那个path,问题就解决了,先看no=‘001’的分组:
select no,sys_connect_by_path(q,';') result from
(select no,q,rn,lead(rn) over(partition by no order by rn) rn1
from (select no,q,row_number() over(order by no,q desc) rn from test)
)
start with no = '001' and rn1 is null connect by rn1 = prior rn
SQL>
6 /

NO RESULT
---------- --------------------------------------------------------------------------------
001 ;n1
001 ;n1;n2
001 ;n1;n2;n3
001 ;n1;n2;n3;n4
001 ;n1;n2;n3;n4;n5

上面结果的最后1条就是我们要得结果了
要得到每组的结果,可以下面这样

select t.*,
(
select max(sys_connect_by_path(q,';')) result from
(select no,q,rn,lead(rn) over(partition by no order by rn) rn1
from (select no,q,row_number() over(order by no,q desc) rn from test)
)
start with no = t.no and rn1 is null connect by rn1 = prior rn
) value
from (select distinct no from test) t

SQL>
10 /

NO VALUE
---------- --------------------------------------------------------------------------------
001 ;n1;n2;n3;n4;n5
002 ;m1
003 ;t1;t2;t3;t4;t5;t6

对上面结果稍加处理就可以了,希望对大家有帮助:)



=============================================================

转自 “oracle”基础和管理\精华区
zzwind5 2005-11-15
  • 打赏
  • 举报
回复

http://community.csdn.net/Expert/TopicView3.asp?id=4387757
wgsasd311 2005-11-15
  • 打赏
  • 举报
回复
学习:)
ATGC 2005-11-14
  • 打赏
  • 举报
回复
税种肯定是有上限的,而且是已知的
用分析函数就可以搞定
可以搜索一下oracle 分析函数,网上肯定有答案的
waterfirer 2005-11-14
  • 打赏
  • 举报
回复
税种有上限吗?
如果不是特别多,写个函数把税种查出来,做循环拼sql
zzwind5 2005-11-14
  • 打赏
  • 举报
回复
税收种类是不是固定的?

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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