繁体   English   中英

SQL 内连接与 sum 和 null 值

[英]SQL Inner join with sum and null value

下表是一组更大数据的摘录在此处输入图像描述

在我的场景中,第 2 列是 null,什么时候是“父”记录(第 1 列 = AB1,第 2 列为 NULL),并且您可以看到第 2 列下的以下 2 个“子”记录具有 AB1 作为标识符,它与列中的 AB1 匹配1,我想要做的是当第 2 列具有相同的标识符 (AB1) 时,对第 3 列的值求和,到目前为止总和 = 29(对于这种情况,我可以做一个 SUM 并按 AB1 分组)。 当第 2 列是 NULL 并且第 1 列是 AB1(父标识符)时,当我需要在第 3 列中添加值 10 时,就会出现我的问题。 通用标识符是 AB1,但对于父记录,标识符位于第 1 列而不是第 2 列。我需要一个 SQL,它返回的总和为 39。

编辑:

感谢您的及时回复,我很抱歉,我认为我的问题不够清楚。 我正在使用 MS SQL Server Management Studio 查询的目标是通过按列 2 上具有相同标识符 (AB1) 的记录分组,然后在列 1 (AB1) 上找到相同的标识符以及将该值添加到总和中。 下面的查询正确地按第 2 列进行分组,因为例如,如果我有 10 条带有标识符 AB1 的记录,它会返回一行,其中包含第 3 列上的金额总和,问题是我还需要添加到那个总和当标识符 AB1 也在第 1 列时。

select t1.Column1, round(sum (t1.Column3),2) as Total from table t1, table t2 where
和 t1.Column2 = t2。 Column1 按 t1 分组。 第 2 列

基本上,该表存储交易,初始交易“父”在第 1 列 (AB1) 中,所有其他与父交易相关联的“子”交易具有该标识符 (AB1) 但在第 2 列。第 1 列是唯一标识符,并且确实不重复,然后是“父”事务,它是第 2 列上的 NULL,但该标识符 (AB1) 可以在第 2 列中重复多次,具体取决于链接到“父”的所有“子”事务。

Oracle
WITH 子句在这里只是为了生成示例数据,因此,它不是答案的一部分。
我不知道预期的结果是什么,但可以使用 Union All 计算总计(没有 Inner Join)

WITH
    tbl AS
        (
            Select 'AB1' "COL_1", Null  "COL_2", 10 "COL_3" From Dual Union All
            Select 'CD2' "COL_1", 'AB1' "COL_2", 15 "COL_3" From Dual Union All
            Select 'EF3' "COL_1", 'AB1' "COL_2", 14 "COL_3" From Dual 
        )
SELECT
    ID, Sum(TOTAL) "TOTAL"
FROM
    (
        SELECT COL_1 "ID", Sum(COL_3)  "TOTAL" FROM tbl GROUP BY COL_1 UNION ALL
        SELECT COL_2 "ID", Sum(COL_3)  "TOTAL" FROM tbl GROUP BY COL_2
    )
WHERE ID Is Not Null
GROUP BY ID
ORDER BY ID
--
--  R e s u l t
--  
ID       TOTAL
--- ----------
AB1         39 
CD2         15 
EF3         14

这是一个 Sum() Group By 聚合,但相同的结果给出了 Sum() 分析 function 与 DISTINCT 关键字。

SELECT DISTINCT
    ID, Sum(TOTAL) OVER(PARTITION BY ID ORDER BY ID) "TOTAL"
FROM
    (
        SELECT COL_1 "ID", Sum(COL_3)  "TOTAL" FROM tbl GROUP BY COL_1 UNION ALL
        SELECT COL_2 "ID", Sum(COL_3)  "TOTAL" FROM tbl GROUP BY COL_2
    )
WHERE ID Is Not Null
--
--  R e s u l t
--  
ID       TOTAL
--- ----------
AB1         39 
CD2         15 
EF3         14

如果您需要 Inner Join,那么答案如下。 请注意,只有 ID 实际上有孩子。 那是因为Inner Join。 问候...

SELECT 
    t1.COL_1 "ID", 
    Max(t1.COL_3) + Sum(t2.COL_3) "TOTAL"
FROM
    tbl t1
INNER JOIN
    tbl t2 ON (t2.COL_2 = t1.COL_1)
GROUP BY t1.COL_1
ORDER BY t1.COL_1
--
--  R e s u l t
--  
ID       TOTAL
--- ----------
AB1         39 
select sum(Column3)
from TheTable
where 'AB1' in (Column1, Column2);

将对父级 ( Column1 = 'AB1' ) 和子级 ( Column2 = 'AB1' ) 的Column3的值求和。

如果父子层次结构有两个以上的级别,并且您想对 Column3 求和孙子Column3孙等,您可以使用分层查询(也称为递归查询)。 确切的语法取决于您的数据库,这是针对PostgreSQL的:

with recursive Hier(Column1, Column2, Column3) as
(
  select Column1, Column2, Column3
  from TheTable
  where Column1 = 'AB1'
union all
  select t.Column1, t.Column2, t.Column3
  from TheTable t
  join Hier h on t.Column2 = h.Column1
)
select sum(Column3)
from Hier;

您可以溢出两组数据,然后将它们合并在一起。 从那里它将是一个简单的 sum group by。

为此,我们简单地说,如果 Column2 为 null,则将 Column1 作为父级,如果 Column2 不是 null,则将 Column2 作为父级

Select Column1 as Parent, Column3 
from TheTable
where Column2 IS null
Union
Select Column2 as Parent, Column3
from TheTable
where Column2 IS not null

从那里您可以将其用作 cte

WITH data AS
(
Select Column1 as Parent, Column3 
from TheTable
where Column2 IS  null
Union
Select Column2 as Parent, Column3
from TheTable
where Column2 IS not null)

Select Parent,  Sum(Column3)
from Data 
Group by Parent

结果将是

Parent  SumColumn3
AB1     39

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM