oracle数据库中group by的用法感悟分享~
·
oracle数据库中group by的用法感悟分享~
最近在用帆软BI写报表,但在多表串联复杂的逻辑中,还需要实现求和、分组等效果,因此有了本次的记录。仅分享,有不对的可以指出,欢迎一起交流学习~
先来列一些概念,便于逻辑分析。
1. 多表链接:
join 用于把来自两个或多个表的行结合起来。
下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。
| 类型 | 描述 |
|---|---|
| INNER JOIN | 返回两个表中满足连接条件的记录(交集)。 |
| LEFT JOIN | 返回左表中的所有记录,即使右表中没有匹配的记录(保留左表)。 |
| RIGHT JOIN | 返回右表中的所有记录,即使左表中没有匹配的记录(保留右表)。 |
| FULL OUTER JOIN | 返回两个表的并集,包含匹配和不匹配的记录。 |
| CROSS JOIN | 返回两个表的笛卡尔积,每条左表记录与每条右表记录进行组合。 |
| SELF JOIN | 将一个表与自身连接。 |
| NATURAL JOIN | 基于同名字段自动匹配连接的表。 |
语法:
SELECT column1, column2, ...
FROM table1
JOIN table2 ON condition;
--参数说明:
--column1, column2, ...:要选择的字段名称,可以为多个字段。如果不指定字段名称,则会选择所有字段。
--table1:要连接的第一个表。
--table2:要连接的第二个表。
--condition:连接条件,用于指定连接方式。
2.order by:
概念:ORDER BY 关键字用于对结果集进行排序。
语法:
SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;
3.group by:
含义: GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
用法:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
4.sum函数:
含义:SUM() 函数返回数值列的总数。
完整的sql如下:
SELECT sfaa.sfaadocno 成品工单号,
sfaa.sfaa010 成品料号,
imaal.imaal004 规格,
sfaa.sfaaud007 原始订单号,
sfaa.sfaa050 成品产出数量,
dc.sfdc004 半成品料号,
CASE
WHEN MAX(CASE
WHEN da.sfda002 = '14' THEN
'自动领料'
WHEN da.sfda002 = '11' THEN
'手动领料'
WHEN da.sfda002 = '24' THEN
'退料'
ELSE
da.sfda002
END) = '退料' THEN
-SUM(dc.sfdc008)
ELSE
SUM(dc.sfdc008)
END AS 消耗的半成品数量,
MAX(CASE
WHEN da.sfda002 = '14' THEN
'自动领料'
WHEN da.sfda002 = '11' THEN
'手动领料'
WHEN da.sfda002 = '24' THEN
'退料'
ELSE
da.sfda002
END) AS 发料类型,
imaa.imaaud001 型别,
imaa.imaa009 产品分群码,
sfaa.sfaaud006 生产厂区
FROM sfba_t sfba
LEFT JOIN sfaa_t sfaa
ON sfba.SFBADOCNO = sfaa.SFAADOCNO
AND sfba.SFBA001 = sfaa.SFAA010
AND sfba.SFBAENT = sfaa.SFAAENT
LEFT JOIN sfdc_t dc
ON dc.SFDC001 = sfba.SFBADOCNO
AND dc.SFDC004 = sfba.SFBA006
AND dc.SFDC001 = sfaa.SFAADOCNO
LEFT JOIN sfda_t da
ON da.sfdasite = dc.sfdcsite
AND da.sfdadocno = dc.sfdcdocno
LEFT JOIN imaa_t imaa
ON imaa.imaa001 = sfaa.sfaa010
AND imaa.imaaent = sfaa.sfaaent
LEFT JOIN imaal_t imaal
ON imaa.imaa001 = imaal.imaal001
and imaa.imaaent = imaal.imaalent
WHERE SUBSTR(sfba.sfbadocno, 4, 4) IN ('0661','0662') and da.sfdastus='S'
and dc.sfdc004 is not null
AND TO_CHAR(sfaa.sfaadocdt, 'YYYY-MM') = '2025-08'
--and imaa.imaa009 like 'A150%'
--and sfaa.sfaadocno='01-0661-2509010004'
/*${if( len (开始日期)== 0,, "and to_char(sfaa.sfaadocdt,'YYYY-MM-DD') >='" +开始日期+ "'" )}
${if( len (结束日期)== 0,, "and to_char(sfaa.sfaadocdt,'YYYY-MM-DD') <='" +结束日期+ "'" )}
${IF( LEN (生产厂区)== 0, , "AND sfaa.sfaaud006 in ('" +生产厂区+ "')" )}
${IF( LEN (型别)== 0, , "AND imaa.imaaud001 in ('" +型别+ "')" )}
${IF( LEN (成品工单号)== 0, , "AND sfaa.sfaadocno like ('%" +成品工单号+ "%')" )}*/
--${if(len(产品分群码) == 0, "", "AND (imaa.imaa009 LIKE '%" + replace(产品分群码, ",", "%' OR imaa.imaa009 LIKE '%") + "%')")}
GROUP BY sfaa.sfaadocno,
sfaa.sfaa010,
imaal.imaal004,
sfaa.sfaaud007,
sfaa.sfaa050,
dc.sfdc004,
imaa.imaa009,
CASE
WHEN da.sfda002 = '14' THEN
'自动领料'
WHEN da.sfda002 = '11' THEN
'手动领料'
WHEN da.sfda002 = '24' THEN
'退料'
ELSE
da.sfda002
END,
imaa.imaaud001,
sfaa.sfaaud006
order by 成品工单号
以上sql是查询sfba.sfbadocno字段截取条件为(4,4)包含’0661,'0662’的,状态为’S’的8月份的所有数据,特别之处就是对数量做了分组求和。下面展示部分数据执行效果,仅供参考执行效果,数据部分打码~
今天先写在这啦,等后面有关于oracle的用法在分享,有不对的欢迎指出~
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)