暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 在SQL中打印小计和总名称

askTom 2018-02-14
214

问题描述

嗨,团队

LiveSQL链接中提供的代码示例。

预期结果:
Mgmt1 State1    18900 1786
Mgmt1 State2    28900 2786
Mgmt1   SUB_TOTAL  47800 4572
Mgmt2 State1    38900 3786
Mgmt2 State2    48900 4786
Mgmt2 SUB-TOTAL  87800 8572
Mgmt3 State1    58900 5786
Mgmt3 SUB_TOTAL  58900 5786
TOTAL   (null)    194500 18930
复制


当前SQL的结果:
Mgmt1 State1    18900 1786
Mgmt1 State2    28900 2786
Mgmt1   (null)     47800 4572
Mgmt2 State1    38900 3786
Mgmt2 State2    48900 4786
Mgmt2 (null)     87800 8572
Mgmt3 State1    58900 5786
Mgmt3   (null)     58900 5786
(null)  (null)    194500 18930
复制


谢谢...

专家解答

使用grouping_id。

将此传递给您的group by中的列。然后它会返回一个数值。

结果是通过连接当前行是否是小计 (1) 或不是 (0) 返回的二进制值来计算的。

例如,该行:
ENT_NAME   ENT_TYPE   REC_COUNT   OCCUPIED_STORAGE(MB)  
Mgmt1                 95600                   9144
复制


是ent_type的小计,但不是ent_name,它以二进制 = 1十进制给出01


ENT_NAME   ENT_TYPE   REC_COUNT   OCCUPIED_STORAGE(MB)  
               389000                  37860
复制


是两列的小计,给出11二进制 = 3十进制。

总的来说,这给出了:

CREATE TABLE tab_ent_stats(
  ent_name VARCHAR2(100), ent_type VARCHAR2(100), rec_count NUMBER, occupied_storage NUMBER
);

INSERT INTO tab_ent_stats VALUES('Mgmt1','State1',18900,1786);
INSERT INTO tab_ent_stats VALUES('Mgmt1','State2',28900,2786);
INSERT INTO tab_ent_stats VALUES('Mgmt2','State1',38900,3786);
INSERT INTO tab_ent_stats VALUES('Mgmt2','State2',48900,4786);
INSERT INTO tab_ent_stats VALUES('Mgmt3','State1',58900,5786);

COMMIT;

SELECT ent_name, ent_type, 
       SUM(rec_count) AS rec_count, 
       SUM(occupied_storage) AS "OCCUPIED_STORAGE(MB)",
       grouping_id(ent_name, ent_type) grp
FROM tab_ent_stats
GROUP BY ROLLUP (ent_name,ent_type)
ORDER BY ent_name,ent_type;

ENT_NAME   ENT_TYPE   REC_COUNT   OCCUPIED_STORAGE(MB)   GRP   
Mgmt1      State1           37800                   3572     0 
Mgmt1      State2           57800                   5572     0 
Mgmt1                 95600                   9144     1 
Mgmt2      State1           77800                   7572     0 
Mgmt2      State2           97800                   9572     0 
Mgmt2                175600                  17144     1 
Mgmt3      State1          117800                  11572     0 
Mgmt3                117800                  11572     1 
               389000                  37860     3
复制


您所需要的只是一个大小写/解码表达式,以将这些值转换为所需的名称。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论