帖子地址:http://www.itpub.net/thread-1635393-1-1.html
楼主问题大致如下:
一个对象有2的八次方(256)个状态,每个状态需要8个状态位来标识。问:如何在状态表表Q内插入如下所有256个状态的数据:
状态ID | 状态位1 | 状态位2 | 状态位3 | 状态位4 | 状态位5 | 状态位6 | 状态位7 | 状态位8 |
1001 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1002 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
...... |
|
|
|
|
|
|
|
|
1256 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
版主dingjun123 解答如下:
WITH t AS
(SELECT 1 a,2 b,3 c,4 d,5 e,6 f,7g,8 h FROM dual)
SELECT
decode(GROUPING(a),1,0,1) a,
decode(GROUPING(b),1,0,1) b,
decode(GROUPING(c),1,0,1) c,
decode(GROUPING(d),1,0,1) d,
decode(GROUPING(e),1,0,1) e,
decode(GROUPING(f),1,0,1) f,
decode(GROUPING(g),1,0,1) g,
decode(GROUPING(h),1,0,1) h
FROM t
GROUP BY CUBE(a,b,c,d,e,f,g,h);
此处对版主提供的SQL进行下简单分析,因为分析之前读不懂这个SQL(^_^)。
CUBE:该函数会对给定的参数列进行组合。所谓组合,即如果GROUP BY CUBE有A,B,C三个参数,则语句会分别按分组A,B,C,AB,AC,BC,ABC进行汇总。所以版主答案会有256行,这是组合的结果。
GROUPING:该函数只有在使用CUBE和ROLLUP的时候可用。(ROLLUP跟CUBE有几分相像,只是分组方式不同)。其参数列必须是GROUP BY子句中的1列(如果想传入多列,可查询GROUPING_ID函数;小心不要跟GROUP_ID函数混淆。),如果该列为空则返回1,否则返回0.
GROUP BY CUBE(c1,c2,...)可能会产生一些不需要的汇总结果。可以考虑使用GROUP BY GROUPING SETS指定分组方式。
另外针对此问题的情形,感觉可以不用DECODE,不当之处,还请指教。
WITH t AS
(SELECT 1 a,2 b,3 c,4 d,5 e,6 f,7g,8 h
FROM dual)
SELECT
GROUPING(a) a,
GROUPING(b) b,
GROUPING(c) c,
GROUPING(d) d,
GROUPING(e) e,
GROUPING(f) f,
GROUPING(g) g,
GROUPING(h) h
FROM t
GROUP BY CUBE(a,b,c,d,e,f,g,h);
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24867611/viewspace-735460/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24867611/viewspace-735460/