【发布时间】:2016-11-24 12:42:53
【问题描述】:
我下面的代码工作正常。它的作用是在移动到新位置时更新每个产品编号
select
a.loc1 As [Location 1],
b.loc2 as [Location 2],
c.loc3 as [Location 3],
d.loc4 as [Location 4]
FROM (select distinct a.ProductNR as Loc1
from LocationsTest a
where a.Date= (select max(Date) from LocationsTest where a.ProductNR = ProductNR)
AND a.Location = 1) as a
FULL OUTER JOIN
(select distinct a.ProductNR as Loc2
from LocationsTest a
where a.Date= (select max(Date) from LocationsTest where a.ProductNR = ProductNR)
AND a.Location = 2) as b
on a.Loc1 = b.Loc2
FULL OUTER JOIN
(select distinct a.ProductNR as Loc3
from LocationsTest a
where a.Date= (select max(Date) from LocationsTest where a.ProductNR = ProductNR)
AND a.Location = 3) as c
ON ISNULL(A.Loc1, b.Loc2) = c.Loc3
FULL OUTER JOIN
(select distinct a.ProductNR as Loc4
from LocationsTest a
where a.Date= (select max(Date) from LocationsTest where a.ProductNR = ProductNR)
AND a.Location = 4) as d
ON ISNULL(b.Loc2, c.Loc3) = d.Loc4
一个演示其工作原理的示例如下所示,您可以在下面的 4 个位置中看到不同的产品编号。
----------------------------------------------------------
| Location 1 | Location 2 | Location 3 | Location 4
----------------------------------------------------------
| 1234 | | | |
| 4567 | | | |
| 8978 | | | |
| 2578 | | | |
----------------------------------------------------------
当一个产品稍后被扫描到一个新位置时,它仍然会像在位置 1 中一样保留在我的历史数据中,但我上面的查询显示它:
----------------------------------------------------------
| Location 1 | Location 2 | Location 3 | Location 4
----------------------------------------------------------
| | 1234 | | |
| 4567 | | | |
| 8978 | | | |
| 2578 | | | |
----------------------------------------------------------
它根据上次更新日期检索数据。 问题是我上面的代码看起来很长,尤其是当我计划在未来添加更多位置时。 那么有没有更好的方法呢?
编辑 - 示例数据:
CREATE TABLE LocationsTest
(
ProductNR varchar (14),
Location int,
Date Datetime,
);
Insert Into LocationsTest (ProductNR, Location, Date)
Values('1234', 1, '2016-11-17 12:30:50.010'),
('4567', 1, '2016-11-17 12:35:50.010'),
('8978', 1, '2016-11-17 12:37:50.010'),
('2578', 1, '2016-11-17 12:50:50.010');
【问题讨论】:
-
请提供源表和一些数据来填充它们。
-
这不是真正的表,它是与我的数据库中几乎相同的表的示例。你知道我可以上传一些数据的网站吗?喜欢小提琴吗?
-
@MishMish 您是否跟踪产品何时从一个位置移动到另一个位置?如果有一张表,其中维护了产品遍历的所有位置,那将是一个简单的查询。基本上,如果你想要历史数据,你需要跟踪它。
-
@SatwikNadkarny 是的,当产品从一个位置移动到另一个位置时,我会在 where 子句中跟踪它。它的作用就像一个魅力,我只需要知道上面的代码是否可以做得更聪明一点?
-
@MishMish 只需输入具有代表性数据的
create table...insert into脚本,然后我们就可以在本地环境中使用它。
标签: sql sql-server full-outer-join