我有如下 2 个表:
表 1:
ID_M, Date, Reservation
001, 2014, 5
001, 2015, 10
001, 2016, 18
002, 2015, 6
002, 2016, 22
表 2:
ID_M, ID_type, Priority,Product_Total
001, 1111, 2, 10
001, 2222, 3, 15
001, 3333, 1, 8
002, 1111, 2, 12
002, 2222, 1, 16
是否可以计算预留的重新分区ID_TYPE? Table 2 priority表示保留的顺序,priority 1表示先保留等。是否可以像下面这样在T-SQL中创建表/View/CTE?
ID_M, ID_Type, DATE, Reservation
001, 3333, 2014, 5,
001, 3333, 2015, 3,
001, 1111, 2015, 7,
001, 1111, 2016, 3,
001, 2222, 2016, 15,
002, 2222, 2015, 6,
002, 2222, 2016, 10,
002, 1111, 2016, 12,
这里的reservation是根据表2的产品总数和表1的产品预留数量计算的。比如2014年,我们在表1中有ID_M = 001的reservation 5,我们搜索ID_M =表2中的001,我们先为优先级为1的产品预留,所以它的ID_type为3333。 所以我们得到所需表中的第一行:001、3333、2014、5。
2015年表1中有10个预定,所以我们先用2014年剩下的ID_Type 3333的产品,然后用ID_Type 1111的产品,ID_type 3333剩下的产品是3(8-5) ,所以左边的预留 7 (10-3) 用于 ID_Type 1111。因此我们从所需的表 3 中获得了第二行和第三行:
001, 3333, 2015, 3, 001, 1111, 2015, 7,
最佳答案
要解决我创建的这段代码:
- 两个表中每一行的唯一ID(行号)
- 两次使用行号连接两个表,一次从 t1 获取值,另一次从 t2 获取值
最后,我使用 SUM 函数对 t1 进行加法和对 t2 进行减法
CREATE PROC#sp_test -- 在您的环境中删除#
作为
-- 这行在你的环境中不存在 -- 开始
将@t1 声明为表(id_m CHAR(3),日期 INT,预订 INT)
声明@t2 为表(id_m CHAR(3),id_type INT,优先级 INT,product_total INT)
插入@t1 (id_m ,日期 ,预订) 选择“001” ,2014 ,5
插入@t1 (id_m ,日期 ,预订) 选择“001” ,2015 ,10
插入@t1 (id_m ,日期 ,预订) 选择“001” ,2016 ,18
插入@t1 (id_m ,日期 ,预订) 选择“002” ,2015 ,6
插入@t1 (id_m ,日期 ,预订) 选择“002” ,2016 ,22
插入@t2 (id_m ,id_type ,优先 ,product_total) 选择“001” ,1111 ,2 ,10
插入@t2 (id_m ,id_type ,优先 ,product_total) 选择“001” ,2222 ,3 ,15
插入@t2 (id_m ,id_type ,优先 ,product_total) 选择“001” ,3333 ,1 ,8
插入@t2 (id_m ,id_type ,优先 ,product_total) 选择“002” ,1111 ,2 ,12
插入@t2 (id_m ,id_type ,优先 ,product_total) 选择“002” ,2222 ,1 ,16
-- 这行在你的环境中不存在 -- 开始
;与cte_t1
AS (SELECT Row_number() OVER (ORDER BY id_m, date) 行号
,*
从@t1),
cte_t2
AS (SELECT Row_number()
结束(
ORDER BY id_m,优先级)rownumber ,*
来自@t2), cte_trn1
AS (SELECT DISTINCT 0 级别 ,a.rownumber ,b.id_m ,b.id_type ,b.优先级 ,一个约会 ,a.预订
来自 cte_t1 内部连接 cte_t2 b ON a.rownumber = b.rownumber), cte_trn2
AS (SELECT DISTINCT 1 level ,a.rownumber ,b.id_m ,b.id_type ,b.优先级 ,一个约会 ,b.product_total
来自 cte_t1 内部连接 cte_t2 b ON a.rownumber = b.rownumber),
cte_union 作为 (
选择 * 来自 cte_trn1 联合所有 选择 * 从 cte_trn2 b), cte_final
作为(选择 id_m ,id_type ,优先 ,日期 ,求和(案例 WHEN level = 0 THEN 保留 其他预订 *- 1 结尾) 超过( 按 id_m 分区 ORDER BY rownumber, level rows UNBOUNDED PRECEDING ) * ( 案子 当水平 = 0 那么 1 否则-1 结束)作为 预订 来自 cte_union)
选择 id_m ,id_type ,优先 ,日期 ,预订
从 cte_final 按 id_m 订购 ,优先级
去
执行#sp_test
去
删除过程#sp_test
关于sql - SQL中的卖单减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45460122/