题目:
要求:按照id分组,bitnum 按位求或
建表语句及测试数据如下:
SQL> create table table_bit (id number(6,0),bitnum varchar2(10));
表已创建。
SQL> insert into table_bit values(1,'001');
已创建 1 行。
SQL> insert into table_bit values(1,'010');
已创建 1 行。
SQL> insert into table_bit values(1,'100');
已创建 1 行。
SQL> insert into table_bit values(2,'000');
已创建 1 行。
SQL> insert into table_bit values(2,'001');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from table_bit;
ID BITNUM
---------- ----------
2 001
1 100
2 100
1 110
1 001
1 010
1 100
2 000
2 001
已选择9行。
以下是我的SQL:
SQL> COL merge_bit FOR A20
SQL> WITH t AS
2 (SELECT rownum rn,
3 tb.id,
4 tb.bitnum,
5 to_number(SUBSTR(tb.bitnum,1,1)) b1,
6 to_number(SUBSTR(tb.bitnum,2,1)) b2,
7 to_number(SUBSTR(tb.bitnum,3,1)) b3
8 FROM table_bit tb
9 )
10 SELECT t.id,
11 DECODE(SIGN(SUM(t.b1)),1,1,0)
12 ||DECODE(SIGN(SUM(t.b2)),1,1,0)
13 ||DECODE(SIGN(SUM(t.b3)),1,1,0) merge_bit
14 FROM t
15 GROUP BY t.id
16 /
ID MERGE_BIT
---------- --------------------
1 111
2 001
SQL>
有人给出了如下的巧妙解法,但是这种解法有个局限,当同一位有多个1时便不能求出正确结果了。
SQL> SELECT id,
2 lpad(SUM(bitnum), 3, '0')
3 FROM
4 (SELECT DISTINCT id, bitnum FROM table_bit
5 ) t
6 GROUP BY id
7 /
ID LPAD(S
---------- ------
1 221
2 101
已用时间: 00: 00: 00.01
SQL>
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26977915/viewspace-733832/
,如需转载,请注明出处,否则将追究法律责任。