我正在构建一个 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 函数来实现这一点?
我使用稍微不同的方法达到了你的最终结果。我的 DB Fiddle 的表名称略有不同,因此您必须根据您的情况调整代码。
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
希望这有帮助