MYSQL:选择一列的 SUM 但该列基于另一个行 ID

Posted

技术标签:

【中文标题】MYSQL:选择一列的 SUM 但该列基于另一个行 ID【英文标题】:MYSQL:Selecting SUM of a column but the column is based of another row ID 【发布时间】:2021-05-25 11:17:46 【问题描述】:

我想要全年的期初库存总和。期初库存基于另一个月的 end_inventory。 begin_inventory_id 包含指向 end_inventory 的另一行的 ID。当它基于另一行的 end_inventory 时,如何正确获得某一年的 begin_inventory 总和。我有下表

id time_period beginning_inventory_id end_inventory gross_sales
1 2020-09-01 null 1000 500
2 2020-10-01 1 2000 500
3 2020-11-01 2 3000 500
4 2020-12-01 3 4000 500
5 2021-01-01 4 5000 500

我有以下 SQL 查询

SELECT SUM(a.gross_sales) as gross_sales, SUM(a.end_inventory) as end_inventory,
                    
(SELECT SUM(b.end_inventory) FROM fs_summary as b WHERE a.beginning_inventory_id = b.id) as beginning_inventory
                    
FROM fs_summary as a
                    
WHERE YEAR(a.time_period) = 2020

我想生成的输出是:

    beginning_inventory = 6000 end_inventory = 10000 总销售额 = 2000

相反,我在 begin_inventory 上得到了空值。

任何帮助都会很棒!

【问题讨论】:

见meta.***.com/questions/333952/… 这个beginning_inventory = 6000 是否存储在您的数据库中?还是在终端上的便签上... Beginning_inventory 未存储。我需要在 begin_inventory_id 中生成 id 的最终库存 - 2020 年应该生成 6000 @Strawberry 我的问题有问题吗? sql 查询有效,我指出了预期和理想的输出。以及详细说明我的表格以及其中的数据 我只能再次向您推荐我之前的评论 【参考方案1】:

我假设您想通过自连接从 1 个表中检索数据。

SELECT SUM(a.gross_sales),SUM(a.end_inventory),SUM(b.end_inventory)
FROM fs_summary a, fs_aummary b
WHERE b.id=a.beginning_inventory_id AND YEAR(a.time_period) = 2020

在这种情况下使用自我加入可以帮助您

编辑:您也可以将此脚本编写为,

SELECT SUM(a.gross_sales),SUM(a.end_inventory),SUM(b.end_inventory)
FROM fs_summary a
INNER JOIN fs_aummary b
ON b.id=a.beginning_inventory_id 
WHERE YEAR(a.time_period) = 2020

【讨论】:

抱歉写错了。这个查询应该有效。这是一张桌子 FROM 子句中带逗号的解决方案如何获得支持? @GordonLinoff 你的意思是不能在 FROM 子句中使用逗号? @BilalBinZia 。 . .一个不应该。几十年来,正确、明确、标准、可读的JOIN 语法一直是 SQL 的一部分。 @GordonLinoff 在性能方面没有区别。但是是的,JOIN 使查询更具可读性【参考方案2】:

使用自联接 SQL,您可以获得结果而不是子查询。

您应该使用两个不同的名称指定同一个表。您的查询如下所示

select sum(virtual_tb.end_inventory) as 'beginning_inventory', sum(org_tb.end_inventory) as 'end_inventory', sum(org_tb.gross_sales)  as 'gross_sales'
from fs_summary org_tb left join fs_aummary virtual_tb on (virtual_tb.beginning_inventory_id = org_tb.id) 
where year(org_tb.time_period) = 2020;

(近似输出)

beginning_inventory end_inventory gross_sales
6000 10000 2000

【讨论】:

以上是关于MYSQL:选择一列的 SUM 但该列基于另一个行 ID的主要内容,如果未能解决你的问题,请参考以下文章

Mysql,如何使用另一列的最大值对一组行进行分组?

MySQL基础入门

更新一行以基于另一行的转换 (Oracle)

当percentile_approx基于groupby返回特定列的单个值时,如何选择另一列的对应值?

Google BigQuery - 根据另一列中的值减去一列的 SUM

根据另一列的顺序制作一列