ORACLE group statistics

ORACLE group statistics

ORACLE statistics

Grouping statistics is: According to certain conditions, using some kind of aggregation function to make
statistics

grouping sets:
The values ​​that need to be grouped can be divided into multiple groups. The multi-group grouping columns in this function have the same effect as group by group1 union group by group2. For example:
select
a,b,c,d,sum(e)
from dept
group by grouping sets((a,b),(c,d));
Equivalent to:
select *
from ( select a,b, c, d,sum(e)
from dept
group by a,b
union
select a, b ,c,d,sum(e)
from dept
group by c,d );
Actual combat: Subtotal: T_AMOUNT total of T_DEPT and T_PROJECT: T_AMOUNT
implementation principle of T_DEPT, divide subdivided types into groups, and then classify large categories Divide into a group.
The sub-category is the nominal subtotal, and the large category is the total.
First, group by T_DEPT and T_PROJECT, then sum(T_AMOUNT) and then group by T_DEPT, and then sum(T_AMOUNT)

create table TE ( ID T_CODE T_NAME VARCHAR2(2), VARCHAR2(4), VARCHAR2(4), T_AMOUNT INTEGER, T_DEPT VARCHAR2(4), T_PROJECT VARCHAR2(4), T_TYPE );

INSERT INTO TE
(ID, T_CODE, T_NAME, T_AMOUNT, T_DEPT, T_PROJECT, T_TYPE)
VALUES
(‘1’, ‘1’, ‘1’, 10, ‘总部’, ‘90’, ‘0’);
INSERT INTO TE
(ID, T_CODE, T_NAME, T_AMOUNT, T_DEPT, T_PROJECT, T_TYPE)
VALUES
(‘2’, ‘2’, ‘2’, 20, ‘总部’, ‘70’, ‘0’);
INSERT INTO TE
(ID, T_CODE, T_NAME, T_AMOUNT, T_DEPT, T_PROJECT, T_TYPE)
VALUES
(‘3’, ‘3’, ‘3’, 30, ‘分 1’, ‘60’, ‘0’);
INSERT INTO TE
(ID, T_CODE, T_NAME, T_AMOUNT, T_DEPT, T_PROJECT, T_TYPE)
VALUES
(‘4’, ‘4’, ‘4’, 40, ‘分 1’, ‘50’, ‘0’);
INSERT INTO TE
(ID, T_CODE, T_NAME, T_AMOUNT, T_DEPT, T_PROJECT, T_TYPE)
VALUES
(‘5’, ‘5’, ‘5’, 50, ‘分 2’, ‘40’, ‘0’);
INSERT INTO TE
(ID, T_CODE, T_NAME, T_AMOUNT, T_DEPT, T_PROJECT, T_TYPE)
VALUES
(‘7’, ‘7’, ‘7’, 40, ‘分 2’, ‘40’, ‘0’);
INSERT INTO TE
(ID, T_CODE, T_NAME, T_AMOUNT, T_DEPT, T_PROJECT, T_TYPE)
VALUES
(‘6’, ‘6’, ‘6’, 60, ‘分 2’, ‘30’, ‘0’);

SELECT DECODE(GROUPING(TE.T_PROJECT), 0, TE.T_DEPT, ‘’),
CASE
WHEN GROUPING(TE.T_PROJECT) = 1 AND GROUPING(TE.T_DEPT) = 1 THEN
‘合计’
WHEN GROUPING(TE.T_PROJECT) = 1 THEN
‘小计’
ELSE
T_PROJECT
END,
SUM(T_AMOUNT)
FROM TE
GROUP BY GROUPING SETS((TE.T_DEPT, TE.T_PROJECT),(TE.T_DEPT))

–Effect
insert image description here
rollup:
ROLLUP(A, B, C)
will first perform GROUP BY on (A, B, C), then perform GROUP BY on (A, B), then perform GROUP BY on (A), and finally perform GROUP BY on the entire table Do GROUP BY

SELECT DECODE(GROUPING(TE.T_PROJECT), 0, TE.T_DEPT, ‘’),
CASE
WHEN GROUPING(T_DEPT) = 1 AND GROUPING(T_PROJECT) = 1 THEN
‘合计’
WHEN GROUPING(T_PROJECT) = 1 THEN
‘小计’
ELSE
T_PROJECT
END,
SUM(T_AMOUNT)
FROM TE
GROUP BY ROLLUP(T_DEPT, T_PROJECT)
效果:
insert image description here

Highlights: group by ROLLUP(t_dept, t_project) first group (t_dept, t_project), and then group t_dept.
This function is very useful when counting different years/months/days/departments/organizations, etc., because the grouping sets function is used You will need to write a lot of grouping modes. Note: the order of parameters affects the ORACLE execution result
cube:
CUBE(A, B, C)
will first perform GROUP BY on (A, C), B, and then (A, B), ( A, C), (A), (B, C), (B), ©, and finally perform GROUP BY on the entire table

SELECT T_PROJECT,
CASE
WHEN GROUPING(T_DEPT) = 1 AND GROUPING(T_PROJECT) = 1 THEN
'Total:'
WHEN GROUPING(T_DEPT) = 1 THEN
T_PROJECT || 'Total Project:'
WHEN GROUPING(T_PROJECT) = 1 THEN
T_DEPT || 'Department total:'
ELSE
T_DEPT
END,
SUM(T_AMOUNT)
FROM TE
GROUP BY CUBE(T_DEPT, T_PROJECT)
ORDER BY T_PROJECT, T_DEPT
insert image description here
[Excerpt from a fellow Taoist, if you offend, you may be offended]

Guess you like

Origin blog.csdn.net/qq_37980551/article/details/89386012