【发布时间】:2018-04-29 16:53:01
【问题描述】:
我有一个简单的库存表:
IF OBJECT_ID('tempdb.dbo.#t') IS NOT NULL
DROP TABLE #t
GO
CREATE TABLE #t
(
[date] DATE,
Item VARCHAR(1),
[Location] INT,
Qty INT
)
INSERT INTO #t ([date], [Item], [Location], [Qty])
VALUES ('2017-11-16', 'A', 1, 5),
('2017-11-16', 'B', 1, 5),
('2017-11-16', 'B', 2, 10),
('2017-11-16', 'A', 3, 1),
('2017-11-16', 'C', 3, 2),
('2017-11-16', 'A', 4, 20),
('2017-11-15', 'A', 1, 5),
('2017-11-15', 'B', 1, 5),
('2017-11-15', 'B', 2, 10),
('2017-11-15', 'A', 3, 1),
('2017-11-15', 'C', 3, 8),
('2017-11-14', 'A', 1, 10),
('2017-11-14', 'B', 1, 1),
('2017-11-14', 'B', 2, 10),
('2017-11-14', 'A', 3, 1),
('2017-11-14', 'C', 3, 8)
我想找出日期(在 where 子句中)以及过去位置项目级别的数量差异。
因此结果应该如下:
+------------+------+----------+-----+------------+---------+
| Date | Item | Location | Qty | LastChange | LastQty |
+------------+------+----------+-----+------------+---------+
| 16.11.2017 | A | 1 | 5 | 14.11.2017 | 10 |
| 16.11.2017 | B | 1 | 5 | 14.11.2017 | 1 |
| 16.11.2017 | B | 2 | 10 | | |
| 16.11.2017 | A | 3 | 1 | | |
| 16.11.2017 | C | 3 | 2 | 15.11.2017 | 8 |
| 16.11.2017 | A | 4 | 20 | | |
+------------+------+----------+-----+------------+---------+
由于库存表很大,我想尽可能避免使用窗口函数。
我已自行加入库存表。但是,我很难找到消除不相关数据集的子句。
SELECT
a.[date],
a.Item,
a.Location,
a.qty,
b.[date] LastChange,
b.qty LastQty
FROM
#t a
LEFT JOIN
#t b ON a.Item = b.Item
AND a.location = b.location
AND b.date < a.date
WHERE
a.date = '2017-11-16'
【问题讨论】:
-
窗口函数比使用子查询更有效。寻找枢轴来执行此操作。
-
您使用的是哪个版本的 SQL Server?此外,还引入了窗口函数来提高此类情况的性能,那么为什么不使用窗口函数呢?
-
很公平,如果这有积极的影响,我会倾向于使用它们。服务器版本为 11.0.6598.0。谢谢:-)
-
@JeanDoux :您的意思是在 MSSQL 中使用数据透视函数?这不是只对一列进行旋转吗?
标签: sql-server sql-server-2012 inventory stock