2016-09-28 16 views
0

MS SQLのクエリを使用して、私たちの "サービスセンター"に過去30日間に1回以上出品したアイテムを表示しています。必要なデータは、シリアル番号にもとづいて、最新のサービス指図に先立つサービス指図からのものです。したがって、アイテムが過去30日間に受信された場合、それが過去30日間に前回受信されたかどうかを確認してください。最後のMAX日付をジョインで取得する方法

ServiceOrdersテーブル:CustIDItemIDDateReceived
ItemMasterテーブル:CustIDItemIDSerialNumber

私は私がに過去月からサービスの注文をロードすることができ

ServiceOrders.DateReceived >= DATEADD(month,-1,GETDATE()) 

を使用してDateReceivedアイテムを取得することができますテンポラリテーブルを作成し、これを照会して以前のサービス指図を取得することができますが、それはベストプランとは言えません。以前のサービス注文を効率的に入手するためのアイデアはありますか?

例データ
ServiceOrdersテーブル:

CustID ItemID DateReceived 
1  2  9/26/2016 
1  2  9/05/2016 
1  2  1/15/2015 
5  6  9/20/2016 
7  6  9/02/2016 

ItemMasterテーブル:

CustID ItemID SerialNumber 
1  2  8675309 
5  6  101 
7  6  101 

そこで、上記の例では、のSerialNumber 8675309及び101は、過去30日間に複数回受信されています。 DateReceived 9/05/2016レコードと2011年9月2日のRecord(30日以内に2番目に新しいレコード)のServiceOrdersとItemMasterからのデータが必要です。両方のテーブルには他のフィールドもありますが、ここでは単純化しています。 CustIDはアイテムを転送できるので、日付から日付まで同じである必要はありません。 SerialNumberがキーです。

+2

あなたの仕事と望ましい結果を説明するのに十分なサンプルデータを投稿してください。 –

+1

PM 77-1に同意します。あなたが実際に何をしているかを示すサンプルデータを投稿することができれば、本当に役に立ちます。 – Connor

+0

データとタグの例が追加されました。 –

答えて

2

最後の月の注文をCommon Table Expressionでcteにフィルタリングし、降順に番号を付けます。次に、cte2に1回以上出現したアイテムを選択し、両方のcteが2番目の行を選択して参加します。

;With cte as(
    Select row_number() over(PARTITION by ItemID order by DateReceived desc) as RowNum, * 
from ServiceOrders 
where DateReceived >= DateAdd(Month, -1, Getdate()) 
), cte2 as(
    Select 
    ItemID From cte 
    Group by ItemID 
    Having count(*)>1 
) 
select b.*, c.SerialNumber from cte2 as a 
left join cte as b on a.ItemID= b.ItemID and b.RowNum=2 
left join ItemMaster as c on b.ItemID=c.ItemID and b.CustID=c.CustID 
0
  1. SELECT *, COUNT(ServiceOrders.DateReceived) as DateCount FROM TABLE

よりも結果=または>を表示する最後の列はあなたのための迅速な解決策になるかもしれません

  • フィルターをExcelに貼り付けます。

  • 0

    過去30日間に複数回受信されたアイテムを取得します。次に、row_numberを使用して、date_receivedの降順に基づいて行に番号を付けます。最後に、row_numberが2(最後の30日以内に最新の日付の前の日付)である行を取得します。

    出力にserialnumberが必要な場合は、join itemmasterテーブルを最終結果セットに追加します。

    WITH morethanone 
    AS (SELECT 
        so.itemid 
    FROM serviceorders so 
    JOIN itemmaster i 
        ON i.itemid = so.itemid 
    GROUP BY so.itemid 
    HAVING COUNT(CASE WHEN DATEDIFF(dd, so.datereceived, GETDATE()) <= 30 THEN 1 END)>1 
    ) 
    SELECT 
        custid, 
        itemid, 
        datereceived 
    FROM (SELECT 
        *, 
        ROW_NUMBER() OVER (PARTITION BY itemid ORDER BY datereceived DESC) rn 
    FROM serviceorders 
    WHERE itemid IN (SELECT itemid FROM morethanone) 
    AND DATEDIFF(dd, datereceived, GETDATE()) <= 30 
    ) x 
    WHERE rn = 2 
    
    関連する問題