help SQL如何写

[复制链接]
查看11 | 回复4 | 2009-7-22 09:30:00 | 显示全部楼层 |阅读模式
表 dots
creacreate table dots(no number, r1 number,r2 number,r3 number, r4 number);
insert into dots
select 200901, null,1,null,4 from dual
union all
select 200902, null,1,null,4 from dual
union all
select 200903, null,1,null,4 from dual
union all
select 200904, null,1,null,4 from dual
union all
select 200905, null,1,null,4 from dual
union all
select 200906, null,1,null,4 from dual
select * from dots
我要统计的结果是
r1
r215
r3
r44 5
就是每个字段的数字出现多少次 其中每个字段的值肯定是一样的,而且列有可能变化 ,比如 r5r6 r7````
回复

使用道具 举报

千问 | 2009-7-22 09:30:00 | 显示全部楼层

如果列有可能变化 ,比如 r5r6 r7........等, 那就要写个stored procedure, 要用动态方式实现。
我觉的表设计的不太合理, 造成开发复杂困难, 并且程序运行的效率非常低,没有意思!



如果基于你的目前数据, 可以用如下代码实现, 具体如下:

SQL> selectcol_name,
2
substr(str, instr(str, '-', 1, 1)+1, instr(str, '-', 1, 2)-instr(str, '-', 1, 1)-1) num,
3
substr(str, instr(str, '-', 1, 2)+1) cnt
4from
5(select decode(b1.rn, 1, 'r1', 2, 'r2', 3, 'r3', 4, 'r4') col_name,
6
case
7
when instr(a1.r1, '-', 1) > 0 and decode(b1.rn, 1, 'r1', 2, 'r2', 3, 'r3', 4, 'r4') = substr(a1.r1, 1, instr(a1.r1, '-', 1)-1) then
8
a1.r1
9
when instr(a1.r2, '-', 1) > 0 and decode(b1.rn, 1, 'r1', 2, 'r2', 3, 'r3', 4, 'r4') = substr(a1.r2, 1, instr(a1.r2, '-', 1)-1) then
10
a1.r2
11
when instr(a1.r3, '-', 1) > 0 and decode(b1.rn, 1, 'r1', 2, 'r2', 3, 'r3', 4, 'r4') = substr(a1.r3, 1, instr(a1.r3, '-', 1)-1) then
12
a1.r3
13
when instr(a1.r4, '-', 1) > 0 and decode(b1.rn, 1, 'r1', 2, 'r2', 3, 'r3', 4, 'r4') = substr(a1.r4, 1, instr(a1.r4, '-', 1)-1) then
14
a1.r4
15
else
16
null
17
end str
18from (select decode(sum(decode(r1, null, 0, 1)), 0, 'r1', 'r1'|| '-' || max(r1) || '-' || count(*)) r1,
19
decode(sum(decode(r2, null, 0, 1)), 0, 'r2', 'r2'|| '-' || max(r2) || '-' || count(*)) r2,
20
decode(sum(decode(r3, null, 0, 1)), 0, 'r3', 'r3'|| '-' || max(r3) || '-' || count(*)) r3,
21
decode(sum(decode(r4, null, 0, 1)), 0, 'r4', 'r4'|| '-' || max(r4) || '-' || count(*)) r4
22from dots) a1,
23(select rownum rn from dual connect by rownum <=4) b1);

COL_NAME NUMCNT
-------- ---------- ----------
r1

r2 1
6
r3

r4 4
6


[ 本帖最后由 bell6248 于 2009-8-12 15:19 编辑 ]
回复

使用道具 举报

千问 | 2009-7-22 09:30:00 | 显示全部楼层
2楼的好牛~
回复

使用道具 举报

千问 | 2009-7-22 09:30:00 | 显示全部楼层
SELECTcol_name,col_value,COUNT(col_value)
FROM (
SELECT 'r'||rn AS col_name
,DECODE(rn,1,r1,2,r2,3,r3,4,r4) AS col_value
FROM dots,(SELECT ROWNUM rn FROM DUAL CONNECT BY ROWNUM<=4)
)
GROUP BY col_name,col_value;
回复

使用道具 举报

千问 | 2009-7-22 09:30:00 | 显示全部楼层
配合thinkai ,4楼写的一样特别
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行