求解!!!这个方程怎么写

--表一:

SELECT

时间,

应收金额

FROM

b1

ORDER BY 时间 asc

--表二:

SELECT

时间

收款金额

from  b2

ORDER BY 时间asc

这两段sql中,表一SQL是应收款,表二sql是收款金额,这两段sql在业务逻辑里没有明确的关系,关联只有用金额关联解释如下:

1、比如在应收款中第一行100,第二行10,第三行30,在收款金额中第一行50,第二行60,那么匹配就应该是收金额第一行和第二行匹配收款的第一行,应收的30去匹配收款的第三行

2、在实际数据中应收款和收款金额总和不一定相等,比如,收款金额总和多了100,那么应收款的指标为空就行,反之应收金额多,收款金额为空。

3、再多写个字段,这个字段用来表示当前行的正负,应收款为正,收款金额为负,为正时在下一行计算时加到应收款中,反之加到收款金额中,。

4、注意在匹配之前,要时间升序。

5、最终输出结果字段应是:应收金额、收款金额、金额差

用Oracle的function编写

SQL 凌晨三点的猫 发布于 2024-10-28 14:38 (编辑于 2024-10-28 15:01)
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共5回答
最佳回答
0
用户k6280494Lv6资深互助
发布于2024-10-28 14:44

那你搞个排序num字段,通过这个字段匹配和汇总求和

最佳回答
0
CD20160914Lv8专家互助
发布于2024-10-28 14:44

大哥,莫扯了,让业务去解决,或者提需求从系统上面去解决,你这样去匹配。。。。太随意了

最佳回答
0
蒲公英FZLJLv5初级互助
发布于2024-10-28 17:43

可以试试

select a.*,b.*,case when b.a2<a.a2 then b.a2-(a.a2-a.a1) else a.a2-(b.a2-b.a1)  end 应收对应的收款金额

from

(

SELECT

时间,

应收金额 a1,

sum(应收金额) over (ORDER BY 时间 asc) a2 -- 累计应收

FROM

b1

ORDER BY 时间 asc

) a

full join

(

SELECT

时间,

收款金额 a1,

sum(收款金额) over (ORDER BY 时间 asc) a2 -- 累计收款

from  b2

ORDER BY 时间 asc

) b

on b.a2-a.a2+a.a1>0

and b.a2-b.a1<a.a2

order by a.时间,b.时间

最佳回答
0
JL98Lv6中级互助
发布于2024-10-28 18:32(编辑于 2024-10-28 18:36)

提供一个思路,

1、先计算累计应收和累计实收,累计应收可以加个排序序号,之后关联一下排序序号+1,得到上一笔的累计应收

2、再关联,关联条件写 累计应收>=累计实收  AND 上一笔累计应收<累计实收,之后计算累计的金额差就行了

3、再把最后  MAX(累计应收)<累计实收    的数据拿出来,union到上面的结果里

最佳回答
0
小测试Lv3见习互助
发布于2024-10-29 13:32

先建两张表 执行下面的sql 

WITH b1_sorted AS (

    SELECT 时间, 应收金额, 应收金额 AS amount, 1 AS sign

    FROM b1

    ORDER BY 时间 ASC

),

b2_sorted AS (

    SELECT 时间, 收款金额, -收款金额 AS amount, -1 AS sign

    FROM b2

    ORDER BY 时间 ASC

),

-- Step 2: 合并表一和表二的数据,并计算累计金额

merged_data AS (

    SELECT 时间, amount, sign,

           SUM(amount) OVER (ORDER BY 时间) AS running_balance

    FROM (

        SELECT * FROM b1_sorted

        UNION ALL

        SELECT * FROM b2_sorted

    ) AS combined_data

    ORDER BY 时间

),

--

-- Step 3: 使用LAG函数获取前一行的余额,计算当前行的差值

result_data AS (

    SELECT 时间,

           CASE WHEN sign = 1 THEN amount ELSE NULL END AS 应收金额,

           CASE WHEN sign = -1 THEN -amount ELSE NULL END AS 收款金额,

--           COALESCE(abs(amount)  - LAG(running_balance, 1, 0) OVER (ORDER BY 时间), running_balance) AS 金额差1,

           COALESCE( LAG(running_balance, 1, 0) OVER (ORDER BY 时间) + amount  , running_balance) AS 金额差2

    FROM merged_data

)

-- Step 4: 输出结果

SELECT 时间, 应收金额, 收款金额,金额差2

FROM result_data

ORDER BY 时间;

  • 6关注人数
  • 280浏览人数
  • 最后回答于:2024-10-29 13:32
    请选择关闭问题的原因
    确定 取消
    返回顶部