2016-03-29 11 views
0

過去のメンバーシップデータと現在のデータの両方を持つ注文テーブルがあります。このデータを1行で表示したい。私は過去のデータの一時テーブルを持っていますが、同じ行に現在のデータを取得するためにこのクエリを書く方法を正確にはわかりません。私はそれが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

ありがとうございます、今、サンプルをアップロードしようとしています。 – user3117087

答えて

0

一時テーブルに過去の会員データを取得するためのクエリがあります。同じテーブルを2回クエリしてエイリアスを与え、エイリアスを使用してカラム名の前に付けることができます。あなたが私たちに完全なスキーマやフィドルを与えてくれなかったので、私はあなたのデータベースを一時テーブルでシミュレートしていますが、本質はここにあります。あなたが言及しなかったという考慮があります。あなたはすべての顧客が過去と現在の両方の記録を持つことを保証していますか?そうでない場合は、INNER JOINのために以下のクエリには表示されません。それをOUTER結合に変更できますが、顧客が新しいレコードを持たない場合は、それらの列にNULL値が表示されます。私の主張は、ここではドラゴンズであるということです。これは決して完璧な防弾対策ではなく、正しい方向への動きだけです。

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

関連する問題