2016-03-29 41 views
0

我有一個包含過去成員資格數據和當前數據的訂單表。我想單行查看這些數據。我有一個過去數據的臨時表,但不完全確定如何編寫此查詢以獲取同一行中的當前數據。我知道這與MAX(order no)有關。下面是查詢以獲得一個臨時表用於追加過去訂單和最近訂單的SQL查詢

set transaction isolation level read uncommitted 

declare 
@ship_master_customer_id varchar (10), @cycle_begin_date datetime, @cycle_end_date datetime, @OrderNo varchar(10), @Description Char(100) 

create table #t1(ShipMasterCustomerID varchar(10), OrderNo varchar (10), cycle_begin_date datetime, cycle_end_date datetime, Description Char(100)) 

Insert into #t1 

Select SHIP_MASTER_CUSTOMER_ID, ORDER_NO, CYCLE_BEGIN_DATE,CYCLE_END_DATE, DESCRIPTION FROM [ORDER_DETAIL] 

where SHIP_MASTER_CUSTOMER_ID = '11115555' and 
CYCLE_END_DATE = '2/29/2016' 

Select * from #t1 
Drop table #t1 



Here is my script. 

    declare 
    @ship_master_customer_id varchar (10), @cycle_begin_date datetime, @cycle_end_date datetime, @OrderNo varchar(10), @Description Char(100) 

    create table #t2(ShipMasterCustomerID varchar(10), OrderNo varchar (10), cycle_begin_date datetime, cycle_end_date datetime, Description Char(100)) 

    Insert into #t2 (shipmastercustomerid, orderno, cycle_begin_date, cycle_end_date, DESCRIPTION) 

    VALUES (1111555,9004731815, 2015/01/01, 2015/31/12,'Annual Mem'), 
    (1111555, 9005148308, 2016/01/01, 2016/31/12,'Annual Mem'), 
    (1111222, 9005027152, 2015/01/03, 2016/29/02,'Annual Mem'), 
    (1111222, 9005440369, 2016/01/03, 2017/31/03,'Annual Mem'), 
    (2223333, 9005027152, 2014/01/01, 2016/31/12,'Annual Mem'), 
    (2223333, 9005442116, 2016/01/01, 2017/31/12,'Annual Mem') 

Select * from #t2 

Drop table #t2 

enter image description here

Sample Data

+0

在這裏非常小心。您似乎正在查看訂單信息,但您的隔離級別爲未提交讀取。隨機丟失和/或重複行可以嗎?它可以並將會發生。如果準確性很重要,不要這樣做。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

+0

這裏真正有幫助的是一些示例數據。你有一個表變量和一個臨時表。你甚至有一個插入到臨時表中...但是插入的來源是我們沒有的表格。 –

+0

謝謝,我正在嘗試上傳一個示例excel。 – user3117087

回答

0

你並不需要一個臨時表過去的成員數據。您可以查詢同一個表兩次,給它一個別名,然後使用別名來爲列名加前綴。既然你沒有給我們一個完整的模式或小提琴,我用臨時表模擬你的數據庫,但其實質是在這裏。不過,有些事情你沒有提到。你保證每個顧客都有歷史和當前的記錄嗎?如果不是,由於INNER JOIN,它們不會出現在下面的查詢中。您可以將其更改爲外部連接,但是當客戶沒有新記錄時,您將在這些列中看到空值。我的觀點是,這裏有龍......這絕不是一個完整的或防彈的解決方案,只是朝着正確的方向輕推。

DECLARE @ORDER_DETAIL AS TABLE(
    ShipMasterCustomerId varchar(20), 
    OrderNo varchar(20), 
    cycle_begin_date date, 
    cycle_end_date date, 
    Description varchar(100) 
) 

INSERT @ORDER_DETAIL SELECT '11115555', '9005337015', '02/26/15', '2/29/16', 'Membership 26-Feb-2015 to 29-Feb-2016' 
INSERT @ORDER_DETAIL SELECT '11115555', '9005743023', '02/28/17', '2/28/17', 'Membership 01-Mar-2016 to 28-Feb-2017' 

SELECT 
    hist.ShipMasterCustomerId, 
    hist.OrderNo, 
    hist.cycle_begin_date, 
    hist.CYCLE_END_DATE, 
    hist.[Description], 
    curr.ShipMasterCustomerId, 
    curr.OrderNo, 
    curr.cycle_begin_date, 
    curr.CYCLE_END_DATE, 
    curr.[Description] 
FROM 
    @ORDER_DETAIL AS hist 
    INNER JOIN @ORDER_DETAIL AS curr ON (
      (curr.ShipMasterCustomerId = hist.ShipMasterCustomerId) AND (curr.cycle_end_date = 
      (SELECT MAX(cycle_end_date) FROM @ORDER_DETAIL WHERE ShipMasterCustomerId = hist.ShipMasterCustomerId)) 
      ) 
WHERE 
    (hist.ShipMasterCustomerId = '11115555') 
    AND 
    (hist.cycle_end_date = '2/29/2016') 
+0

謝謝!我如何擴展這個查詢?我使用週期結束日期的原因是,我得到了在特定日期結束的會員資格總數,找到任何SHIP_MASTER_CUSTOMER_ID的MAX訂單號告訴我他們是否續訂。 – user3117087

+0

您必須先定義「比例」。你只想向那些從未更新過的客戶展示過去的數據(在數據庫中只有1條記錄),過去有過更新但過去一年沒有更新過的客戶等?你需要給我們更多的信息。 – dazedandconfused