根据另一个表中的日期添加其他列以进行查询

时间:2018-03-06 12:28:47

标签: sql-server-2008 join

我正在查询 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'  );

1 个答案:

答案 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;