我有一個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