【问题标题】:Join Sales table with Sales Region table based on Sales person and the date of the sale根据销售人员和销售日期将销售表与销售区域表连接起来
【发布时间】:2020-08-28 19:04:05
【问题描述】:

我有一张销售表,但它不包括销售区域。我还有一张根据分配区域和日期分配销售人员的表格。我想加入这些表格,这样我就可以获取该地区并将其包含到我的销售表格中。

我加入了销售人员的首字母(键),但我还想将销售日期与地区开始和地区停止进行比较以加入正确的地区。我尝试使用开始和停止之间的销售日期,但这不起作用,因为如果他们目前仍在该地区,它会提供一个 NULL 值。

感谢您的帮助,布伦特

IF NOT EXISTS (
    select * from sysobjects where name='sales' and xtype='U'
)CREATE TABLE sales (
    [Sale_Date] DATETIME,
    [Sales_Person] NVARCHAR(3),
    [Sales_Amount] INT,
    [Region] INT
);
INSERT INTO sales VALUES
    ('2016-07-01 00:00:00',N'MDD',152,NULL),
    ('2016-09-21 00:00:00',N'MDD',278,NULL),
    ('2018-03-01 00:00:00',N'STE',385,NULL),
    ('2018-04-01 00:00:00',N'MDD',426,NULL),
    ('2019-02-25 00:00:00',N'MDD',224,NULL),
    ('2020-02-15 00:00:00',N'STE',261,NULL),
    ('2020-03-01 00:00:00',N'STE',480,NULL),
    ('2020-06-05 00:00:00',N'BBB',245,NULL),
    ('2020-07-05 00:00:00',N'BBB',178,NULL);


IF NOT EXISTS (
    select * from sysobjects where name='SalesPersonAssignment' and xtype='U'
) CREATE TABLE SalesPersonAssignment (
    [sales_person] NVARCHAR(4),
    [Region_ID] INT,
    [Region_Name] NVARCHAR(6),
    [Region_Start_Date] DATETIME,
    [Region_Stop_Date] NVARCHAR(10)
);
INSERT INTO SalesPersonAssignment VALUES
    (N'MDD',2,N'North ','2015-01-05 00:00:00',N'12/31/2017'),
    (N'MDD',6,N'West','2018-01-01 00:00:00',N'NULL'),
    (N'STE ',6,N'West','2018-10-02 00:00:00',N'12/31/2019'),
    (N'STE',2,N'North ','2020-01-01 00:00:00',N'NULL'),
    (N'BBB',1,N'South','2019-01-01 00:00:00',N'NULL');



Select s.Sale_Date, s.Sales_Amount, s.Sales_Person, spa.Region_Name
FROM sales s LEFT OUTER JOIN SalesPersonAssignment spa ON s.Sales_Person = spa.sales_person
--join based on the sales date and region's start/stop date of the sales person

【问题讨论】:

  • 旁注 - 我认为将 SalesPersonAssignment.Region_Stop_Date 设为可为空的日期时间类型而不是 nvarchar 会更好。

标签: sql sql-server


【解决方案1】:

您将日期存储为字符串。并且时间组件是不必要的。更好的方法是:

CREATE TABLE SalesPersonAssignment (
    [sales_person] NVARCHAR(4),
    [Region_ID] INT,
    [Region_Name] NVARCHAR(6),
    [Region_Start_Date] DATE,
    [Region_Stop_Date] DATE
);

 

INSERT INTO SalesPersonAssignment VALUES
    (N'MDD',2,N'North ','2015-01-05','2017-12-31'),
    (N'MDD',6,N'West','2018-01-01', NULL),
    (N'STE ',6,N'West','2018-10-02', '2019-12-31'),
    (N'STE',2,N'North ','2020-01-01', NULL),
    (N'BBB',1,N'South','2019-01-01', NULL);

只需在ON 子句中包含这些条件:

SELECT s.Sale_Date, s.Sales_Amount, s.Sales_Person, spa.Region_Name
FROM sales s LEFT OUTER JOIN
     SalesPersonAssignment spa
     ON s.Sales_Person = spa.sales_person AND
        s.Sale_Date >= spa.Region_Start_Date AND
        (s.Sale_Date <= spa.Region_End_Date OR spa.Region_End_Date IS NULL);

【讨论】:

  • 抱歉,忘记 ON 只是一个错字。这是我尝试的第一件事,但是 sps.region_end_date 中的 null 值为 null 会导致返回的结果为 null。谢谢
  • @布伦特。 . .我不会想到一个日期会被存储为一个字符串。修复数据模型!
  • 完美运行。 ON 声明的最后一部分让我很受挫。感谢您的帮助,以后我会更好地发布问题。
猜你喜欢
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2013-01-30
  • 2012-09-12
  • 1970-01-01
相关资源
最近更新 更多