根据小时窗口获取数量总和
Posted
技术标签:
【中文标题】根据小时窗口获取数量总和【英文标题】:Get sum of qty based on hour window 【发布时间】:2021-10-18 20:24:36 【问题描述】:我正在解决一个问题,以确定在特定时间之间创建和发送了多少产品。例如,我需要查看今天下午 6 点到明天下午 3 点之间创建了多少(创建的意思是使用 X 数量创建了多少订单)。我正在尝试为此创建一个时间箱,但无论我尝试什么都行不通。
select CREATE_DATE
, CREATE_TIME
, RELEASED_DATE
, RELEASED_TIME
, sum(case
when CREATE_DATE = DATEADD(DAY, DATEDIFF(DAY, 0, CREATE_DATE), 0)
and CREATE_TIME >= '18:00:00' AND CREATE_DATE = DATEADD(DAY, DATEDIFF(DAY, 0, CREATE_DATE), 1)
then ORDER_QTY
when CREATE_DATE = DATEADD(DAY, DATEDIFF(DAY, 0, CREATE_DATE), 1)
and CREATE_TIME <= '14:59:59'
then ORDER_QTY
end) as small_window_qty
, sum(ORDER_QTY) as ord_qty
, sum(RELEASED_QTY) as rls_qty
from table
对此的任何帮助将不胜感激。只需要一种方法将日子组织到以下存储桶中:正常时间窗口 = 下午 6 点到 6 点创建;较小的小时窗口 = 下午 6 点到 3 点创建;同意 = 下午 3 点(上午 12 点至下午 3 点)发货
编辑:一些澄清。我试图完成的是根本原因分析。我们有每天创建的订单,并且必须在创建后 2 天内发货。我们正试图弄清楚为什么我们的订单没有按时发货。因此,作为 RCA,我试图深入了解订单的创建时间、发货时间(或发布时间相同)以及发货时间。上述时间窗口是为某一天创建订单的截止时间。示例:
今天创建了 300 个单位,它们必须在 2 天后发货。我想看看,在创建的 300 个中,有多少是在下午 3 点之前创建的,其中有多少是在当天下午 3 点之前发送的。希望能澄清事情。并非所有创建的东西都必须在同一天发货,因为我们有 2 天的时间来运送订单。
【问题讨论】:
最好显示一些分布在 2 天(至少)内的样本数据,这些数据触及所有可能的窗口并显示哪些行属于哪些窗口。您的最后一个窗口有点令人担忧,因为它指的是“调度”而不是“创建”。这将有助于澄清您如何知道某些东西是“由...发送的”。 此外,如果您遇到转换问题,查看表定义(包括列名/类型)通常会有所帮助。 转换不是问题,只是在此处无法创建正确的表达式。我应该澄清一下,dispatch = Release,同样的事情。 @SM我已将结果添加到原始帖子中 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或键入问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。 【参考方案1】:你留下了很多信息,所以我在这里填补空白并做出假设。仔细检查我的数据类型是否与您的数据类型一致。
create table sales (create_date date, create_time time, released_date date, released_time time, qty int)
insert sales
select '1/14/13','18:45','1/15/13','10:45', 10
union all
select '1/14/13','19:45','1/15/13','12:45', 12
union all
select '1/15/13','19:15','1/16/13','16:45', 6
union all
select '1/15/13','18:00','1/16/13','14:45', 25
union all
select '1/15/13','18:45','1/16/13','15:00', 3
union all
select '1/16/13','19:45','1/17/13','16:30', 1
union all
select '1/16/13','20:45','1/17/13','17:45', 9
union all
select '1/17/13','18:30','1/18/13','18:00', 17
union all
select '1/18/13','18:30','1/19/13','17:15', 15
union all
select '1/18/13','18:45','1/19/13','19:15', 21
with base as
(
select *
, cast(create_date as datetime) + cast(create_time as datetime) as createtime
, cast(released_date as datetime) + cast(released_time as datetime) as releasetime
, datediff(hour,cast(create_date as datetime) + cast(create_time as datetime),cast(released_date as datetime) + cast(released_time as datetime)) as hrs
from sales
),
base2 as
(
select qty
, case
when create_time >= '18:00' and hrs <= 21 then 'small'
when create_time >= '18:00' and hrs <= 24 then 'normal'
else 'outside'
end as orderwindow
, case
when hrs between 6 and 21 then 'pass'
else 'fail'
end as agreedupon
from base
)
select sum(qty) as qty, orderwindow, agreedupon
from base2
group by orderwindow, agreedupon
drop table sales
这应该让您能够判断创建了多少、它属于哪个时间窗口以及是否在下午 3 点之前发布。根据需要进行调整。
我不想让代码变得混乱和复杂,所以我使用了 2 个 CTE。
【讨论】:
非常感谢您的回答,您的回答很有帮助。我可以接受它并努力看看我是否可以改进它。我已经在我原来的帖子中发布了一些澄清,希望对您有所帮助。【参考方案2】:我不确定您的预期结果,而且您的输入数据看起来杂乱无章且不清楚。所以我使用了上述答案提供的数据。看起来你得到了运行总和。如果您可以查看答案并在需要更多修改时与我联系,那就太好了。我建议您编辑您的问题,并更清楚地了解您的示例数据和预期答案。为问题添加更多详细信息。
create table sales (create_date date, create_time time, released_date date, released_time time, qty int)
INSERT INTO sales
select '1/14/13','18:45','1/15/13','10:45', 10
union all
select '1/14/13','19:45','1/15/13','12:45', 12
union all
select '1/15/13','19:15','1/16/13','16:45', 6
union all
select '1/15/13','18:00','1/16/13','14:45', 25
union all
select '1/15/13','18:45','1/16/13','15:00', 3
union all
select '1/16/13','19:45','1/17/13','16:30', 1
union all
select '1/16/13','20:45','1/17/13','17:45', 9
union all
select '1/17/13','18:30','1/18/13','18:00', 17
union all
select '1/18/13','18:30','1/19/13','17:15', 15
union all
select '1/18/13','18:45','1/19/13','19:15', 21
SELECT
create_date
, create_time
, released_date
, released_time
,SUM(QTY) OVER ( PARTITION BY A.[Dispatched Window] ORDER BY released_date ) AS [Sum_qty]
,Qty
FROM
(
SELECT
create_date
, create_time
, released_date
, released_time
, CASE WHEN released_date BETWEEN CONVERT(DATETIME, CONVERT(CHAR(8), create_date, 112) + ' ' + CONVERT(CHAR(8), '18:00:00.0000000' , 108)) AND CONVERT(DATETIME, CONVERT(CHAR(8), DATEADD(DAY,1, create_date), 112) + ' ' + CONVERT(CHAR(8), '18:00:00.0000000' , 108)) THEN 'Normal Window'
WHEN released_date BETWEEN CONVERT(DATETIME, CONVERT(CHAR(8), create_date, 112) + ' ' + CONVERT(CHAR(8), '17:59:00.0000000' , 108)) AND CONVERT(DATETIME, CONVERT(CHAR(8), DATEADD(DAY,1, create_date), 112) + ' ' + CONVERT(CHAR(8), '15:00:00.0000000' , 108)) THEN 'Smaller Window'
WHEN released_date BETWEEN CONVERT(DATETIME, CONVERT(CHAR(8), create_date, 112) + ' ' + CONVERT(CHAR(8), '00:00:00.0000000' , 108)) AND CONVERT(DATETIME, CONVERT(CHAR(8), create_date, 112) + ' ' + CONVERT(CHAR(8), '15:00:00.0000000' , 108)) THEN 'Aggreed AUpon'
ELSE 'N/A'
END AS [Dispatched Window]
, Qty
FROM dbo.sales
) AS A
【讨论】:
@silverwing90 你能检查一下这个答案,然后用你的示例数据和预期的输出回复我,这会很棒 非常感谢您的回答,但这并不是我所需要的。我在原来的帖子中发布了上面的一些说明。希望澄清足够 我检查了您的详细信息,但我有一个问题,如果您可以添加一些数据脚本示例和预期输出作为图像,我可以提供一点帮助。因为你的查询不是很清楚。那就是有人破坏了你的问题。我正在努力帮助你。但我需要提到的细节。谢谢@silverwing90以上是关于根据小时窗口获取数量总和的主要内容,如果未能解决你的问题,请参考以下文章