我正在查询 datatbl 表,并根据 productstbl 表的 Start_date 值返回包含附加列的表格
下面我创建了一个包含初始表(datatbl_before)和所需最终结果(datatbl_after)的模式,其中 Product_Lookup 列已添加到 datatbl 表中并根据该行的 Asset_ID 和 Start_date 显示来自 productstb 的相应产品。
例如,在 datatbl 的第一行中,该行与Asset_ID“1”相关并发生在2017-08-16,这将从 productstbl 表,因为它位于 start_date 值2017-08-12之后,但在2017-09-27的下一个 start_date 值之前与该Asset_ID相关
在Asset_ID查找和start_date没有进行日期的情况下,可以返回'NONE'值 - 例如 datatbl
的第5行任何人都可以就如何解决这个问题提供任何指导或建议吗?
非常感谢提前!
CREATE TABLE datatbl_before (
PDate DATE,
Asset_ID varchar(255),
Rev int
);
CREATE TABLE datatbl_after (
PDate DATE,
Asset_ID varchar(255),
Rev int,
Product_Lookup varchar(255)
);
CREATE TABLE productstbl (
Asset_ID varchar(255),
Start_date DATE,
Product varchar(255)
);
INSERT INTO productstbl
VALUES
(' 1 ',' 2017-08-12' ,' A' ),
(' 1' ,' 2017-09-27' ,' B' ),
(' 1' ,' 2018-02-14' ,' C' ),
(' 2' ,' 2018-01-17' ,' A' ),
(' 2' ,' 2018-02-21' ,' B' ),
(' 2' ,' 2018-03-05' ,' C' );
INSERT INTO datatbl_before
VALUES
(' 2017-08-16' ,' 1' ,' 10'),
(' 2017-09-29' ,' 1' ,' 15'),
(' 2018-02-13' ,' 1' ,' 12'),
(' 2018-02-19' ,' 1' ,' 10'),
(' 2018-01-01' ,' 2' ,' 12'),
(' 2018-01-25' ,' 2' ,' 33'),
(' 2018-02-25' ,' 2' ,' 67'),
(' 2018-03-07' ,' 2' ,' 71');
INSERT INTO datatbl_after
VALUES
(' 2017-08-16' ,' 1' ,' 10' ,' A' ),
(' 2017-09-29' ,' 1' ,' 15' ,' B' ),
(' 2018-02-13' ,' 1' ,' 12' ,' B' ),
(' 2018-02-19' ,' 1' ,' 10' ,' C' ),
(' 2018-01-01' ,' 2' ,' 12' ,' NONE'),
(' 2018-01-25' ,' 2' ,' 33' ,' A' ),
(' 2018-02-25' ,' 2' ,' 67' ,' B' ),
(' 2018-03-07' ,' 2' ,' 71' ,' C' );
答案 0 :(得分:1)
您可以使用子查询,该查询使用where子句中外部查询的数据来选择所需的数据。在这种情况下,它会找到所有正确资产的产品,并在交易日期之前或之后开始,对它们进行排序,以便最新的产品是第一个(我们想要的)并且仅采用那个(TOP 1部分)
ISNULL部分将任何缺失值从NULL更改为' NONE'
Select DB.*,
ISNULL(
(Select top 1 product
from productstbl
where Asset_ID = DB.Asset_ID
and Start_date <= DB.PDate
order by Start_date desc
)
, 'NONE') as Product_Lookup
from datatbl_before DB;