最近在用帆软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的用法在分享,有不对的欢迎指出~

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐