一个数据汇总,列合并的例子

本文介绍了一种基于SQL的方法来实现库存管理中的后进先出原则。通过创建和使用临时表及函数,可以准确地根据当前库存量匹配最新的进货记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-- 问题
库存表A(现有库存)
PARTNO PARTDESC VENDO GRADE SALESTYPE UNIT QTY
A001            N-07          L      KG  800
B005            M01            O      KG  500
.....
收货记录表B
PARTNO VENDNO SALESTYPE ACTQTY INDATE(收货时间)
A001    N-07    L      250    5/01       
A001    N-07    L      250    6/10
A001    N-07    O      300    6/15
A001    N-07    L      300    6/25
A001    N-07    L      300    7/02
A001    N-66    L      250    7/08
A001    M88      L      280    7/1
B005    M01      O      300    5/05
B005    M01      O      200    6/01
......

为实现后进先出的目的,根据库存量取出最近的收货记录
比如物料A001 N-07 L 库存量是800,则取出最近>=800数量的收货记录
A001    N-07    L      300  7/02
A001    N-07    L      300  6/25
A001    N-07    L      250  6/10
                            300+300+250>=800
条件:1 B表的PARTNO VENDNO SALESTYPE 三个字段的值等于表A的
 

PARTNO PARTDESC VENDO GRADE SALESTYPE UNIT QTY  收货记录
A001            N-07          L    KG  800  7/02 300 6/25 300 6/10 250
B005            M01          O    KG  500  6/01 200  5/05 300

得到以上的结果就行,格式不限

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

-- 解答

drop table tba,tbb
create table tbA(partno varchar(10), PARTDESC varchar(10), VENDNO varchar(10), GRADE varchar(10), SALESTYPE varchar(10), UNIT varchar(10), QTY int)
create table tbB(PARTNO varchar(10), VENDNO varchar(10), SALESTYPE varchar(10), ACTQTY int, INDATE datetime)
insert into tbA select 'A001', '', 'N-07', '', 'L', 'KG', 800
insert into tbA select 'B005', '', 'M01', '', 'O', 'KG',  500
insert into tbB select 'A001', 'N-07', 'L', 250    , '2008-05-01'       
insert into tbB select 'A001', 'N-07', 'L', 250    , '2008-06-10'
insert into tbB select 'A001', 'N-07', 'O',       300    , '2008-06-15'
insert into tbB select 'A001', 'N-07', 'L',       300    , '2008-06-25'
insert into tbB select 'A001', 'N-07', 'L',       300    , '2008-07-02'
insert into tbB select 'A001', 'N-66', 'L',       250    , '2008-07-08'
insert into tbB select 'A001', 'M88', 'L',      280    , '2008-07-01'
insert into tbB select 'B005', 'M01', 'O',      300    , '2008-05-05'
insert into tbB select 'B005', 'M01', 'O',       200    , '2008-06-01'

--drop function dbo.test
create
alter function dbo.test(@partno varchar(10), @vendno varchar(10), @SALESTYPE varchar(10), @actqty int)
returns @tbtest table(partno varchar(10), PARTDESC varchar(10), VENDO varchar(10), GRADE varchar(10), SALESTYPE varchar(10), UNIT varchar(10), QTY int,memo varchar(200))
as
begin
 declare @s int,@ss varchar(100)
 select @s = 0, @ss = '';
 select
 @ss = @ss + '  ' + case when @s < 800 then convert(varchar(10),indate,120) + ' ' + rtrim(actqty) else '' end,
 @s = @s + case when @s < @actqty then actqty else 0 end
 from tbB where partno = @partno and vendno = @vendno and SALESTYPE = @SALESTYPE order by indate desc
 --select @s,@ss
    insert into @tbtest
    select *,@ss from tbA where partno = @partno and vendno = @vendno and SALESTYPE = @SALESTYPE
    return
end
select b.* from tba a CROSS APPLY
dbo.test(a.partno, a.vendno, SALESTYPE, qty) b
--where a.partno = 'a001'

### 使用 `groupby` 合并特定数据 当需要基于某些条件对数据框中的特定执行操作时,`pandas` 提供了多种方法来实现这一目标。对于合并或组合特定数据而言,通常会涉及到使用 `groupby()` 方法配合其他函数一起工作。 #### 利用 `agg` 函数进行自定义聚合 如果目的是计算每组内某几的不同汇总统计量,则可以通过传递字典给 `.agg()` 来指定不同应用不同的聚合逻辑[^2]: ```python import pandas as pd import numpy as np df1 = pd.DataFrame({ 'key': ['a', 'b', 'a', 'b'], 'data1': np.random.rand(4), 'data2': np.random.rand(4) }) result = df1.groupby('key').agg({'data1': sum, 'data2': [np.median, max]}) print(result) ``` 这段代码展示了如何针对两分别求和以及获取中位数与最大值的操作。 #### 自定义聚合函数的应用 除了内置的聚合功能外,还可以通过编写匿名函数(lambda 表达式)来自定义更复杂的聚合行为。下面的例子说明了怎样找到各组内的极差——即最大值减去最小值的结果[^3]: ```python custom_agg_result = df1.groupby('key')[['data1', 'data2']].agg( lambda arr: arr.max() - arr.min() ) print(custom_agg_result) ``` 此段脚本实现了按 `'key'` 分类后,对 `'data1'` 和 `'data2'` 进行极差分析的任务。 #### 结合 `transform` 实现非聚合型转换 有时可能希望保留原始 DataFrame 的结构而不改变其形状,在这种情况下可以考虑采用 `transform` 方法。它允许我们为每一行添加新的字段作为该行所属分组的一个属性值,而不是返回一个新的、经过压缩后的表单[^4]。 ```python transformation_example = df1.copy() def range_diff(group): return group.max() - group.min() transformation_example['range'] = transformation_example.groupby('key')['data1'].transform(range_diff) print(transformation_example[['key', 'data1', 'range']]) ``` 上述例子中,新创建的一 `'range'` 记录着对应于原记录所在分类下的数值范围差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值