mysql group by cube_GROUPING函数来排除group by cube数据问题

在使用MySQL的GROUP BY CUBE进行数据汇总时,遇到了相同维度值但汇总值不同的问题。通过引入GROUPING函数,可以识别出哪些行是由CUBE函数产生的汇总行。GROUPING函数的值为1表示该列被汇总,值为0表示该列未参与汇总。通过这种方式,可以定位到源表中的脏数据,即reg字段为'0000'的记录。

起因:group by cube的结果中出现两条维度值一样,汇总值不一样的数据。

SELECT * FROM(

SELECT NVL(T.REG,'0000') AS REGION_ID,

NVL(T.PROJECT_TYPE, '0000') AS PROJECT_TYPE_ID,

NVL(T.VOLTAGE_LEVEL, '0000') AS VOL_CLASSIFY_ID,

NVL(T.CURRENT_NODE, '0000') AS NODE_ID,

NVL(T.TOTAL_CONTROL_INFO, '0000') AS TOTAL_CONTROL_TYPE_ID,

SUM(T.CN) AS CN,

SUM(T.AMT) AMT

FROM TMP T

WHERE 1 = 1

GROUP BY CUBE(T.REG,

T.PROJECT_TYPE,

T.VOLTAGE_LEVEL,

T.CURRENT_NODE,

T.TOTAL_CONTROL_INFO)) T

WHERE 1=1

AND T.REGION_ID='0000'

AND T.PROJECT_TYPE_ID='0000'

AND T.VOL_CLASSIFY_ID='0000'

AND T.TOTAL_CONTROL_TYPE_ID='75'

AND T.NODE_ID='9';

f92a467ce4224fae7962061e61ad3f36.png

使用GROUPING函数排除原因:

SELECT * FROM(

SELECT NVL(T.REG,'0000') AS REGION_ID,

NVL(T.PROJECT_TYPE, '0000') AS PROJECT_TYPE_ID,

NVL(T.VOLTAGE_LEVEL, '0000') AS VOL_CLASSIFY_ID,

NVL(T.CURRENT_NODE, '0000') AS NODE_ID,

NVL(T.TOTAL_CONTROL_INFO, '0000') AS TOTAL_CONTROL_TYPE_ID,

grouping(REG) AS REG,

grouping(PROJECT_TYPE) AS PROJECT_TYPE,

grouping(VOLTAGE_LEVEL) AS VOLTAGE_LEVEL,

grouping(TOTAL_CONTROL_INFO) AS TOTAL_CONTROL_INFO,

grouping(TOTAL_CONTROL_INFO) AS TOTAL_CONTROL_INFO,

SUM(T.CN) AS CN,

SUM(T.AMT) AMT

FROM TMP T

WHERE 1 = 1

GROUP BY CUBE(T.REG,

T.PROJECT_TYPE,

T.VOLTAGE_LEVEL,

T.CURRENT_NODE,

T.TOTAL_CONTROL_INFO)) T

WHERE 1=1

AND T.REGION_ID='0000'

AND T.PROJECT_TYPE_ID='0000'

AND T.VOL_CLASSIFY_ID='0000'

AND T.TOTAL_CONTROL_TYPE_ID='75'

AND T.NODE_ID='9';

e705400e952a44758fc1fbcfa09381f7.png

通过GROUPING函数可以看出,一条数据使用了reg来进行汇总,一条则没有使用,这个时候就可以看出来,源表中存在reg为0000的脏数据。

解释:

如上结果中GROUPING函数返回值“0”和“1”的含义。

如果显示“1”表示CUBE函数对应的列(例如REG字段)是由于CUBE函数所产生的空值对应的信息,即对此列进行汇总计算后的结果。

如果显示“0”表示此行对应的这列参未与分组汇总活动。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值