sql - SQL中的卖单减法

标签 sql sql-server tsql sql-server-2012

我有如下 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,

最佳答案

要解决我创建的这段代码:

  1. 两个表中每一行的唯一ID(行号)
  2. 两次使用行号连接两个表,一次从 t1 获取值,另一次从 t2 获取值
  3. 最后,我使用 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/

相关文章:

php - 多个表中的平均值的平均值

c++ - 如何使用SQLite将数据从数据库中的值导出到C/C++中的字符串或char中?

sql-server - 每当级别变化超过1时,MS sql表就会添加行,以便每行的start_level和end_level相差1

sql - 如何使同一项目的多次出现与第一次出现的值不同?

sql-server - 使用 SQL 比较表中的两个日期并返回较大者

php - 使用 mysqli 和准备好的语句时命令不同步

sql - 谷歌电子表格查询功能列ID不是列的字母

javascript - 如何将给定表的整数列显示为从 1 开始的自动递增系列给前端用户?

sql - 堆表中的转发提取

sql-server - 修改存储过程的架构?