如果找不到产品_成本.开始日期小于产品_收入.开始日期的产品_成本.金额,我如何将产品_成本.金额默认为0?

我在这里用创建脚本和低于https://dbfiddle.uk/PM2nCk5R的查询创建了一把小提琴

查询如下;

SELECT
   YEAR(product_revenues.revenue_date) AS revenueYear,
    MONTH(product_revenues.revenue_date) AS revenueMonth,
    SUM(product_revenues.amount) AS totalRevenue,
    COALESCE(SUM(product_costs.amount), 0)  AS totalCost,
    SUM(product_revenues.amount - COALESCE(product_costs.amount, 0)) AS totalProfit
    FROM product_revenues
    LEFT JOIN product_costs
       ON product_costs.start_date <= product_revenues.revenue_date
       AND product_costs.start_date = (
         SELECT MAX(start_date)
         FROM product_costs
         WHERE start_date <= product_revenues.revenue_date
        )
     WHERE product_revenues.team_id = 1
     AND product_costs.team_id =1
     AND product_revenues.stripe_product_id ='prod_1234'
     AND product_costs.stripe_product_id ='prod_1234'
     AND product_revenues.revenue_date BETWEEN NOW() - INTERVAL 12  MONTH AND NOW()
     GROUP BY revenueMonth, revenueYear
     ORDER BY revenueMonth ASC;

这些表格是

产品成本

id team_id amount stripe_product_id start_date
1 1 1000 prod_1234 2023-08-01

产品收入表

id team_id amount stripe_product_id revenue_date
1 1 1000 prod_1234 2023-07-05
2 1 1000 prod_1234 2023-09-01
3 1 1000 prod_1234 2023-10-01

预期结果

revenueYear revenueMonth totalRevenue totalCost totalProfit
2023 07 1000 0 1000
2023 09 1000 600 400
2023 10 1000 600 400

因此,收入id%1没有成本,因为没有早于它的成本记录.但是id 2和3将被归因于成本id 1.我认为Left Join返回所有记录,但我的查询被限制为仅返回2和3收入id.

推荐答案

如果在WHERE子句中引用LEFT JOIN表,那么它实际上会将其转换为INNER JOIN.您可能需要将这些类型的条件移动到JOIN子句中

Sql相关问答推荐

SQL计数所有值在联接范围内的行

基于模式或其他行集的数据复制

为什么postgres中CURRENT_TIMESTAMP的日期与CURRENT_DATE不同?

SQL是否可以计算每年的所有日期变化?

有没有办法在每次计算每一行的数据时更新2个值?

Postgres:对包含数字的字符串列表进行排序

对任何(数组)使用LIKE?

SQL:计算与另一列中给定值互斥的匹配项

PostgreSQL:使用JSONB中的字段使用jsonb_to_Records()填充记录

更正用于判断错误组合的SQL

插入具有预期逻辑的查询以Forking 表

我可以在 T-SQL (SQL Server) 的函数内使用 OPTION 子句吗?

如何在插入时将字符串'03-January-2023'转换为日期时间

如何将 CONCATENATED 值与临时表中的值匹配

如何筛选 GROUP BY 结果? HAVING 没有产生预期的结果

忽略与给定列匹配的行的 LAG 函数

SQL Select 最大并获取列名

SQL - 使用子查询返回多行的 LIKE 命令

具有关联统计信息 N+1 的 Rails 6 索引资源?

在sql server中创建唯一标识符列