SQL Server-根据运行总计将值分配给字段

时间:2018-12-06 18:04:36

标签: sql-server

对于一个客户,我正在通过一个XML文件发送到另一个系统,销售订单,我将所有销售订单行中每个项目的数量相加(例如:如果我有“ ItemA” 在每个数量不同的10个销售订单中,我求和并发送总数。

作为回报,无论是否可以将所请求的数量交付给客户,我都会得到答复。如果没有,我仍然可以获得可以交付的总数量。但是,在某些情况下,我需要100件“ ItemA” ,而我不能全部交付100件,但只能交付98件。在这种情况下,我需要分发(到expect一个自定义字段)这98个FIFO,根据每个销售订单中要求的数量并基于每个销售订单的注册日期。

我尝试使用await block from the previous one or add it to the previous chain, TestCafe immediately throws an error at,但无法达到预期的效果。这是我的代码:

AssertionError: start button remains disabled: expected [Function: __$$clientFunction$$] to be falsy"

回复示例

我要求提供35件,但只能交付30件。我需要根据请求的数量为每个销售订单分配这30件,还需要根据订单的日期分配FIFO。因此,在此示例中,我将使用请求的数量(因为我有库存)来更新UPDATE列,在最后一个中,我分配剩余的5件。

WHILE LOOP

有人可以给我一个提示吗?谢谢

1 个答案:

答案 0 :(得分:1)

这可能比需要的更为冗长,但是如果可能的话,我会把它留给您使用。

设置数据:

Google
Apple
Microsoft
Samsung

对于总计,对于SQL Server 20012以及更高版本,#include<stdio.h> #include<string.h> int main() { char a[20][20],str[20]; int i; FILE *file; file=fopen("./test.txt","r"); if(file == NULL) printf("FILE NOT Opened...\n"); for(i=0;i<5;i++) { if(fgets(str, 20, file) != NULL) { strcpy(a[i], str); printf("%s",a[i]); } } char *tmp; tmp = malloc(20); // still same error int j; for(i=0; a[i]; i++) { for(j = 0; a[j]; j++) { if(strcmp(a[i], a[j]) < 0) { strcpy(tmp,a[i]); strcpy(a[i],a[j]); strcpy(a[j],tmp); } } } for(i = 0; a[i]; i++) printf("%s\n", a[i]); return 0; } 是首选技术,因此我开始介绍了一些变体。该查询带来了一些有用的数字:

DECLARE @OrderLines TABLE(
   ord_Code      INTEGER  NOT NULL
  ,CustOrderCode VARCHAR(7) NOT NULL
  ,[Date]          DATE  NOT NULL
  ,ItemCode      VARCHAR(5) NOT NULL
  ,ReqQty        INTEGER  NOT NULL
  ,AvailQty      INTEGER  NOT NULL
  ,RealQty       INTEGER  NOT NULL
);
INSERT INTO @OrderLines(ord_Code,CustOrderCode,[Date],ItemCode,ReqQty,AvailQty,RealQty) VALUES (141389,'CV/2539','2018-11-25','PX085',10,0,0);
INSERT INTO @OrderLines(ord_Code,CustOrderCode,[Date],ItemCode,ReqQty,AvailQty,RealQty) VALUES (141389,'CV/2550','2018-11-26','PX085', 5,0,0);
INSERT INTO @OrderLines(ord_Code,CustOrderCode,[Date],ItemCode,ReqQty,AvailQty,RealQty) VALUES (141389,'CV/2563','2018-11-27','PX085',10,0,0);
INSERT INTO @OrderLines(ord_Code,CustOrderCode,[Date],ItemCode,ReqQty,AvailQty,RealQty) VALUES (141389,'CV/2564','2018-11-28','PX085',10,0,0);

DECLARE @AvailQty INTEGER = 30;

然后我用SUM() OVER做一些数学运算。 SELECT ol.ord_Code, ol.CustOrderCode, ol.Date, ol.ItemCode, ol.ReqQty, @AvailQty AS AvailQty, SUM(ReqQty) OVER (PARTITION BY ord_Code ORDER BY [Date]) AS TotalOrderedQty, @AvailQty-SUM(ReqQty) OVER (PARTITION BY ord_Code ORDER BY [Date]) AS RemainingQty FROM @OrderLines AS ol; 表达式有毛,但第一步检查处理此行后的RemainingQty是否为正,如果是,则执行该顺序。如果没有,我们将尽力而为。嵌套的CASE可以阻止负数进入结果集中。

RemainingQty

窗口函数(例如CASE)只能位于SELECT ol.ord_Code, ol.CustOrderCode, ol.Date, ol.ItemCode, ol.ReqQty, @AvailQty AS AvailQty, SUM(ReqQty) OVER (PARTITION BY ord_Code ORDER BY [Date]) AS TotalOrderedQty, @AvailQty-SUM(ReqQty) OVER (PARTITION BY ord_Code ORDER BY [Date]) AS RemainingQty, CASE WHEN (@AvailQty-SUM(ReqQty) OVER (PARTITION BY ord_Code ORDER BY [Date])) > 0 THEN ol.ReqQty ELSE CASE WHEN ol.ReqQty + (@AvailQty-SUM(ReqQty) OVER (PARTITION BY ord_Code ORDER BY [Date])) > 0 THEN ol.ReqQty + (@AvailQty-SUM(ReqQty) OVER (PARTITION BY ord_Code ORDER BY [Date])) ELSE 0 END END AS RealQty FROM @OrderLines AS ol SUM() OVER子句中,因此我必须使用SELECT来生成派生表。如果您愿意,CTE也可以在这里工作。但是我使用派生表来ORDER BY基表。

JOIN

结果:

UPDATE

在此处使用其他可用的数量值进行播放:https://rextester.com/MMFAR17436