从上一行获取值

问题描述 投票:0回答:1

我正在构建一个 Power BI 报告来跟踪不同地点的各种商品的库存和库存水平。我的数据源是 Navision 中存储在 SQL Server 中的项目分类帐条目表。该表捕获每个日期和位置的物品移动情况。

我已使用 SQL 查询导入数据:现在我有一个表,其中包含我发生变动的日期的股票数据。

示例:

发布日期 货号 位置代码 数量
2024-05-10 项目-A LOC-1 10
2024-05-11 项目-B LOC-2 5
2024-05-12 项目-A LOC-1 -2
2024-05-14 项目-C LOC-2 15

现在我想知道前几天的股票价值。该股票价值等于前一天的股票价值。

预期结果:

发布日期 货号 位置代码 数量
2024-05-10 项目-A LOC-1 10
2024-05-11 项目-A LOC-1 10
2024-05-11 项目-B LOC-2 5
2024-05-12 项目-A LOC-1 -2
2024-05-12 项目-B LOC-2 5
2024-05-13 项目-A LOC-1 -2
2024-05-13 项目-B LOC-2 5
2024-05-14 项目-A LOC-1 -2
2024-05-14 项目-B LOC-2 5
2024-05-14 项目-C LOC-2 15

我尝试使用 SQL 查询和交叉联接来做到这一点,但它不起作用(我只有带有移动的日期,没有交叉联接),我不知道为什么。我首先创建一个表“日期”,其中包含日历中的所有日期。然后,我计算表“dstock”中有变动的天数的库存数量,最后,我尝试在日历日期、item_no 和位置之间进行交叉联接,以获得所有可能的组合,并且如果库存数量不为 NULL, JOIN 函数,我尝试将其与上一行中的 LAG 函数一起使用:

WITH min_max_dates AS (
    SELECT 
        MIN([Posting Date]) AS min_date,
        MAX([Posting Date]) AS max_date
    FROM [CBD$Item Ledger Entry]
),

Dates AS (
    SELECT 
        DATEADD(DAY, number, min_date) AS date
    FROM 
        min_max_dates
    JOIN 
        master..spt_values ON type = 'P'
    WHERE 
        number <= DATEDIFF(DAY, min_date, max_date)
), 

day_quantity AS (
  SELECT
    il.[Posting Date] as posting_date,
    il.[Item No_] as item_no,
    il.[Location Code] as location_code,
    SUM(il.[Quantity]) as quantity
  FROM [Axereal Hungary Kft$Item Ledger Entry] AS il
  GROUP BY il.[Posting Date], il.[Item No_], il.[Location Code]
),

dstock AS(
SELECT
    posting_date,
    item_no,
    location_code,
    SUM(quantity) OVER (PARTITION BY item_no, location_code ORDER BY posting_date 
                              ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS stock
FROM
    day_quantity
)

SELECT
  d.date AS posting_date,
  dstock.item_no as item_no,
  dstock.location_code as location_code,
  COALESCE(dstock.stock, LAG(dstock.stock, 1) OVER (ORDER BY d.date ASC)) AS stock
FROM Dates d
CROSS JOIN (SELECT DISTINCT item_no, location_code FROM dstock) dq
LEFT JOIN dstock ON d.date = dstock.posting_date
                              AND dstock.item_no = dq.item_no
                              AND dstock.location_code = dq.location_code
ORDER BY d.date DESC, dq.location_code, dq.item_no

如果 SQL 不是实现我想要的目标的好方法,有没有办法使用 DAX 函数来实现这一点?

sql sql-server powerbi dax
1个回答
0
投票

我使用稍微不同的方法达到了你的最终结果。我的 DB Fiddle 的表名称略有不同,因此您必须根据您的情况调整代码。

TLDR;

SELECT
  Date
  , ItemNo
  , LocationCode
  , Quantity
FROM (
  SELECT
      *
      , Max(row_num) OVER (PARTITION BY date, itemno) as last_row
  FROM (
    SELECT
        Date
        , ItemNo
        , LocationCode
        , Quantity
        , ROW_NUMBER() OVER(PARTITION BY Date, ItemNo ORDER BY PostingDate) as row_num
    FROM (
      SELECT * FROM InventoryPostings as a
      CROSS JOIN Calendar as c
      WHERE c.Date >= a.PostingDate
    ) as row_table
  ) as max_row_table
) as final_table
WHERE row_num = last_row

说明

  • 使用交叉联接将所有日期带入表中,但我们只保留日历日期高于或等于过帐日期的行。
  • 计算item/date分区的行号,并按记录的真实日期排序。
  • 我们过滤结果,仅保留上一步的最后一行,这将是当前日期之前发布的最后数量。

希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.