2017-02-10 135 views
0

我有2個表加入這些表:Saleorder和材料在底部,如何根據日期範圍

表Saleorder:

Saleorder Datecreated Material 
A    2016-01-01  M1 
B    2016-01-21  M1 
C    2016-03-01  M1 

和材料:

Material Changedon Materialresponsible 
M1   2016-01-01  E 
M1   2016-01-20  F 
M1   2016-02-26  G 

現在我想連接表格Saleorder與表材料基於材料和Datecreated和changeondate,我想這樣的結果:

Saleorder Datecreated Material materialresponsible 
A    2016-01-01  M1    E 
B    2016-01-21  M1    F 
C    2016-03-01  M1    G 

爲dateCreated會和Changedon日之間的關係的邏輯是:

按訂單一個是在2016年1月1日創建的,在這一天的metarial M1與materialresponsible E組有效。

按訂單B在上21.01創建,但metarial M1具有改變on20.01,所以Materialresponsible F爲有效

階下於01.03創建,但材料M1已經改變了26.02,所以材料負責G是有效的

你能幫我怎麼做嗎?

感謝


CREATE TABLE [dbo].[Saleorder1](
    [Saleorder] nvarchar (20) NULL, 
    [Datecreated] date NULL, 
    [Material] nvarchar (20) NULL, ) 
INSERT INTO Saleorder1 (Saleorder,Datecreated,Material) 
VALUES ('A','2016-01-01','M1'), 
('B','2016.01.21','M1'), 
('C','2016.03.01','M1') 


    CREATE TABLE [dbo].[Material2](
    [Material] nvarchar(20) NULL, 
    [Changedon] date NULL, 
    [Materialresponsible] nvarchar(20) NULL,) 
INSERT INTO Material2 
VALUES ('M1','2016-01-01','E'), 
('M1','2016-01-20','F'), 
('M1','2016-02-26','G') 
+1

爲什麼MySQL標記? – Strawberry

+0

哪個DBMS? MySQL或SQL Server?不可能都是......你到目前爲止嘗試過什麼?例如,有多個條件的連接? – ADyson

+0

是否有銷售創建的數據和材料更改數據的任何標準。 – Wintergreen

回答

0

如果您正在使用SQL Server 2012+,您可以使用LEAD函數來獲得上述結果

模式:

CREATE TABLE #Saleorder1(
[Saleorder] nvarchar (20) NULL, 
[Datecreated] date NULL, 
[Material] nvarchar (20) NULL, ) 


INSERT INTO #Saleorder1 (Saleorder,Datecreated,Material) 
VALUES ('A','2016-01-01','M1'), 
('B','2016.01.21','M1'), 
('C','2016.03.01','M1') 


CREATE TABLE #Material2(
[Material] nvarchar(20) NULL, 
[Changedon] date NULL, 
[Materialresponsible] nvarchar(20) NULL,) 

INSERT INTO #Material2 
VALUES ('M1','2016-01-01','E'), 
('M1','2016-01-20','F'), 
('M1','2016-02-26','G') 

現在做用LEAD功能選擇如下

SELECT S.Saleorder, S.Datecreated, M.Material,M.Materialresponsible 
FROM #Saleorder1 S 
INNER JOIN (

SELECT Material ,Changedon ,Materialresponsible 
,ISNULL(LEAD(Changedon) OVER(ORDER BY (SELECT 1)),GETDATE()) Changedon_To_Dte 
FROM #Material2 

)M ON S.Material = M.Material 
AND S.Datecreated BETWEEN M.Changedon AND M.Changedon_To_Dte 

而其結果將是

+-----------+-------------+----------+---------------------+ 
| Saleorder | Datecreated | Material | Materialresponsible | 
+-----------+-------------+----------+---------------------+ 
| A   | 2016-01-01 | M1  | E     | 
| B   | 2016-01-21 | M1  | F     | 
| C   | 2016-03-01 | M1  | G     | 
+-----------+-------------+----------+---------------------+ 

,如果你使用SQL Server的版本。

--CTE for SNO Generation 
;WITH CTE AS(
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) SNO 
,Material,Changedon,Materialresponsible 
FROM #Material2 
) 

--CTE2 for generating Changedon_To_Dte by SELF Joining 
,CTE2 AS (
SELECT C1.Material,C1.Changedon,C1.Materialresponsible 
, ISNULL(C2.Changedon, GETDATE()) AS Changedon_To_Dte 
FROM CTE C1 
LEFT JOIN CTE C2 ON C1.SNO+1 = C2.SNO 
) 

SELECT S.Saleorder, S.Datecreated, C2.Material,C2.Materialresponsible 
FROM #Saleorder1 S 
INNER JOIN CTE2 C2 ON S.Material = C2.Material 
AND S.Datecreated BETWEEN C2.Changedon AND C2.Changedon_To_Dte