SQL计算每天的期初、入库、出库、结存数

1 篇文章 0 订阅
1 篇文章 1 订阅

这是一道面试题,答案如下:

方法一:

使用窗口函数,按照t1.ru_date>t2.ru_date自关联,使用窗口函数计算当天之前的所有入库之和、所有出库之和,再配合ROW_NUMBER() 窗口函数倒序,去行号为1的,详情如下SQL

WITH table_test AS (
	SELECT '2017-02-1' AS ru_date,200 AS ru_ku, 10 AS chu_ku
	UNION
	SELECT '2017-02-2' AS ru_date,10 AS ru_ku, 30 AS chu_ku
	UNION
	SELECT '2017-02-5' AS ru_date,50 AS ru_ku, 10 AS chu_ku
	UNION
	SELECT '2017-02-6' AS ru_date,60 AS ru_ku, 80 AS chu_ku
	UNION
	SELECT '2017-02-7' AS ru_date,10 AS ru_ku, 90 AS chu_ku
)

SELECT 
    ru_date 入库时间,
    sum_in-sum_out 期初,
    ru_ku 入库,
    chu_ku 出库,
    sum_in - sum_out + ru_ku - chu_ku 库存
FROM (
    SELECT 
        t1.*,
        SUM(IFNULL(t2.ru_ku,0)) OVER(PARTITION BY t1.ru_date ORDER BY t2.ru_date) sum_in,
        SUM(IFNULL(t2.chu_ku,0)) OVER(PARTITION BY t1.ru_date ORDER BY t2.ru_date) sum_out,
        ROW_NUMBER() OVER(PARTITION BY t1.ru_date ORDER BY t2.ru_date DESC) AS r
    FROM table_test t1
    LEFT JOIN table_test t2 ON t1.ru_date>t2.ru_date
) AS t
WHERE r=1

方法二:

更改sql_mode,直接用group by 即可,详情如下:

-- 更改sql_mode否则会报错
SET sql_mode='';

WITH table_test AS (
	SELECT '2017-02-1' AS ru_date,200 AS ru_ku, 10 AS chu_ku
	UNION
	SELECT '2017-02-2' AS ru_date,10 AS ru_ku, 30 AS chu_ku
	UNION
	SELECT '2017-02-5' AS ru_date,50 AS ru_ku, 10 AS chu_ku
	UNION
	SELECT '2017-02-6' AS ru_date,60 AS ru_ku, 80 AS chu_ku
	UNION
	SELECT '2017-02-7' AS ru_date,10 AS ru_ku, 90 AS chu_ku
)
SELECT 
	t1.ru_date '入库时间',
	SUM(IFNULL(t2.ru_ku,0))-SUM(IFNULL(t2.chu_ku,0)) AS '期初',
	t1.ru_ku '入库数',
	t1.chu_ku '出库数',
	SUM(IFNULL(t2.ru_ku,0))-SUM(IFNULL(t2.chu_ku,0))+t1.ru_ku-t1.chu_ku AS '库存'
FROM table_test t1
LEFT JOIN table_test t2 ON t1.ru_date>t2.ru_date
GROUP BY 1
;

因为sql_mode默认为full_group_by,只按一个字段分组会报错,所有加上SET sql_mode=''

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liang_cr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值