我有一个SQL查询问题。我下表在SQL服务器2014年从其他行匹配日期匹配
declare @t table (STORE_ID int, INDEX_ID int, START_DATE datetime,
END_DATE datetime,
GROSS_SALES_PRICE decimal(10,2),
NET_SALES_PRICE INT
);
insert into @t
values (3,22,'2014-08-01 00:00:00.000', '2014-09-30 23:59:59.000', 29.99,25),
(3,22,'2014-10-01 00:00:00.000', '2014-12-31 23:59:59.000', NULL,NULL),
(3,22,'2015-01-01 00:00:00.000', '2015-09-30 23:59:59.000', 39.99,28),
(4,22,'2016-01-01 00:00:00.000', '2016-07-31 23:59:59.000', 29.99,25),
(4,22,'2016-08-01 00:00:00.000', '2016-12-31 23:59:59.000', NULL,NULL),
(4,22,'2017-01-01 00:00:00.000', '2018-09-30 23:59:59.000', 39.99,28),
(1,22,'2014-08-30 00:00:00.000', '2014-10-31 23:59:59.000', 39.99,28),
(1,22,'2014-11-01 00:00:00.000', '2016-09-30 23:59:59.000', 20.99,15)
正如你可以看到有在某些行GROSS_SALES_PRICE
和NET_SALES_PRICE
一些空值。这种情况是从STORE_ID
等于1的行中获取这个价格。例如,如果您在第二行中有NULL值,您可以从商店编号1的这个周期中获取价格。但是在这个周期中,您有两个不同的价格。所以你必须把这条空行分成两行,并采取两种不同的价格。如果没有加密部分,则行的部分应该保留为NULL。所有的日期都是可分的。结果应该看起来像这样。
declare @t2 table (STORE_ID int, INDEX_ID int, START_DATE datetime,
END_DATE datetime,
GROSS_SALES_PRICE decimal(10,2),
NET_SALES_PRICE INT
);
insert into @t2
values (3,22,'2014-08-01 00:00:00.000', '2014-09-30 23:59:59.000', 29.99,25),
(3,22,'2014-10-01 00:00:00.000', '2014-10-31 23:59:59.000', 39.99,28),
(3,22,'2014-11-01 00:00:00.000', '2014-12-31 23:59:59.000', 20.99,15),
(3,22,'2015-01-01 00:00:00.000', '2015-09-30 23:59:59.000', 39.99,28),
(4,22,'2016-01-01 00:00:00.000', '2016-07-31 23:59:59.000', 29.99,25),
(4,22,'2016-08-01 00:00:00.000', '2016-09-30 23:59:59.000', 20.99,15),
(4,22,'2016-10-01 00:00:00.000', '2016-12-31 23:59:59.000', NULL,NULL),
(4,22,'2017-01-01 00:00:00.000', '2018-09-30 23:59:59.000', 39.99,28),
(1,22,'2014-08-30 00:00:00.000', '2014-10-31 23:59:59.000', 39.99,28),
(1,22,'2014-11-01 00:00:00.000', '2016-09-30 23:59:59.000', 20.99,15)
正如您前面的问题的讨论,日期范围的这种方法是有问题的。另见: [不良习惯踢:错误处理日期/范围查询 - 亚伦伯特兰](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick- mishandling-date-range-queries.aspx) – SqlZim