SQL Server 如何用SQL查询计算商品在库时间

ozxc1zmp  于 2023-02-11  发布在  其他
关注(0)|答案(1)|浏览(151)

好吧,既然我第一次尝试是不理解,我会再试一次。
我正在尝试用SQL编写一个查询,在最后给出一个实体商品在库存中的总天数,即大于0的天数。
该表有3个字段kArticle d已预订t可用
我想计算tAvailable〉0的次数。
我的问题是,无论何时发生销售,都创建一个条目,因此存在许多tAvailable〉0的条目。
我只对从收到货物到它不再可用的时间感兴趣。
所以我必须设法除去无用的数据,或者使查询清楚,必须按时间顺序处理表,并且不管后面有多少也大于0的值,只有最旧的值是感兴趣的。
此表应作为示例。在最简单的情况下,数据如下所示
| k文章|d已预订|t可用|
| - ------|- ------|- ------|
| 二百五十|二○二○年一月一日|1个|
| 二百五十|二○二○年一月十日|无|
| 二百五十|二○二○年一月二十日|1个|
| 二百五十|二○二○年一月三十日|无|
我现在要做的很简单,我要计算:
when tAvailable = 0 then (dBooked) - ( pref dBooked)
并将其格式化为Date,使表格如下所示:
| k文章|d已预订|t可用|可用天数|
| - ------|- ------|- ------|- ------|
| 二百五十|二○二○年一月一日|1个|无|
| 二百五十|二○二○年一月十日|无|十个|
| 二百五十|二○二○年一月二十日|1个|无|
| 二百五十|二○二○年一月三十日|无|十个|
但是当表看起来像这样时我该怎么办:
| k文章|d已预订|t可用|
| - ------|- ------|- ------|
| 二百五十|二○二○年一月一日|五个|
| 二百五十|二○二○年一月十日|四个|
| 二百五十|二○二○年一月二十日|三个|
| 二百五十|二○二○年一月三十日|第二章|
| 二百五十|二○二○年二月十日|1个|
| 二百五十|二○二○年二月二十日|无|
我的想法是使用一个helper字段,因为我只对日期01.01.2020和日期20.02.2020感兴趣

if tAvailable >0 and pref. tAvailable !>0 
then helper = 1 
Else
""*no entry*

Plus

if tAvailable <= 0 and pref tAvailable !<=0
then helper = 0
ELSE
""*no entry*

将/应该创建此表的
| k文章|d已预订|t可用|助手|
| - ------|- ------|- ------|- ------|
| 二百五十|二○二○年一月一日|五个|1个|
| 二百五十|二○二○年一月十日|四个||
| 二百五十|二○二○年一月二十日|三个||
| 二百五十|二○二○年一月三十日|第二章||
| 二百五十|二○二○年二月十日|1个||
| 二百五十|二○二○年二月二十日|无|无|
我只需要到不显示helper =""得到这个
| k文章|d已预订|t可用|助手|
| - ------|- ------|- ------|- ------|
| 二百五十|二○二○年一月一日|五个|1个|
| 二百五十|二○二○年二月二十日|无|无|
现在我又可以做同样的事了
when Helper = 0 then (dBooked) - ( pref dBooked)
首先,我真的不能做上面的任何事情!我只是告诉聊天GPT我想要什么,他为我做,但因为我不知道在SQL中做什么,我正在尝试我知道那将是excel
这就是为什么我和那么多如果一起工作
最后,我的方法有几个问题:
如果第一行是0,我得到一个错误。2如果最后一行不是0,我需要为查询执行的日期创建一个。
我需要按正确的顺序做数学题等等
我以前试过什么都不重要我只是给你看证明我试过我能做的但我需要的是这个:
| k文章|d已预订|t可用|库存天数|
| - ------|- ------|- ------|- ------|
| 二百五十|二○二○年一月一日|无||
| 二百五十|二○二○年一月二日|五个||
| 二百五十|二○二○年一月十日|四个||
| 二百五十|二○二○年一月二十日|无|二十个|
| 二百五十|二○二○年一月三十日|第二章||
| 二百五十|二○二○年二月十日|1个||
| 二百五十|二零二零年二月十一日|无|十一|
| 二百五十|二零二零年二月十一日|1个||
| 二百五十|* * 添加了系统日期时间()**|无|~*一千 *|
或者仅仅是借方价值。所有库存天数相加
| 库存天数|
| - ------|
| 小行星|
目前为止我知道的是

WITH CTE AS (
  SELECT dBooked, tAvailable, 
         ROW_NUMBER() OVER (ORDER BY dBooked) - 
         ROW_NUMBER() OVER (PARTITION BY tAvailable ORDER BY dBooked) AS group_id
  FROM (
    SELECT dBooked, tAvailable
    FROM tArtikelHistory
    WHERE kArticle = 250
    UNION ALL
    SELECT SYSDATETIME(), 0
  ) t
),
CTE2 AS (
  SELECT MIN(dBooked) AS start_date, MAX(dBooked) AS end_date, tAvailable, group_id
  FROM CTE
  GROUP BY group_id, tAvailable
)
SELECT start_date, end_date, tAvailable, 
       LAG(end_date) OVER (ORDER BY start_date) AS prev_end_date,
       CASE WHEN tAvailable = 0 THEN DATEDIFF(day, LAG(end_date) OVER (ORDER BY start_date), end_date) END AS gap_in_days
FROM CTE2

现在我需要计算间隔天数的总和

nmpmafwu

nmpmafwu1#

您需要创建库存从〉0到0的"组",然后将MIN日期与零日期进行比较:
大概是这样的:

-- Create some sample data
select kArticle, cast(dbooked as date) as dt, CAST(tAvailable AS INT) AS tAvailable
into #data
from 
(
    VALUES (250, N'2019-12-01', 1)
    ,   (250, N'2019-12-10', 0)
    ,   (250, N'2019-12-20', 1)
    ,   (250, N'2019-12-30', 0)
    ,   (250, N'2020-01-01', 5)
    ,   (250, N'2020-01-10', 4)
    ,   (250, N'2020-01-20', 3)
    ,   (250, N'2020-01-30', 2)
    ,   (250, N'2020-02-10', 1)
    ,   (250, N'2020-02-20', 0)
) t (kArticle,dBooked,tAvailable)

-- Group
SELECT  CASE WHEN tAvailable = 0 THEN DATEDIFF(DAY, LastAvailableDay, dt) END AS [DAYS IN STOCK] -- Calculate diff
,   *
FROM    (
    -- Take first available day per group
    SELECT  MIN(dt) OVER(PARTITION BY kArticle, PrevZero ORDER BY dt) AS LastAvailableDay
    ,   *
    FROM    (
        select  *
        -- Group from previous stock 0 until the next zero
        ,   SUM(CASE WHEn prevAvailable = 0 THEN 1 ELSE 0 END) OVER(PARTITION BY kArticle ORDER BY dt) AS prevZero
        from (
            select  *
            ,   LAG(tAvailable) OVER(PARTITION BY kArticle ORDER BY dt) AS prevAvailable
            from #data d
            ) x
        ) x
    ) x
order by dt
            
drop table #data

相关问题