2015-12-17 16 views
5

最初は申し訳ありません、件名が貧弱です。仕事の注文の順序を表示するSQLクエリ

編集:ここにクエリは、私は EDITをOrderNumbersを複製しないようにクエリを必要としていますOrderNumbersを複製:質問を短縮し、私は仕事の受注のすべてのレコードを持つテーブルを持っている非常にクリーン質問

を提供実行された。注文には2種類あります。インストールとトラブルコール。私の質問は、インストールから30日以内に発生したトラブル・コールのすべてを検索し、そのトラブル・コール(TC)を適切なInstall(IN)に照合することです。したがって、トラブル・コールの日付はインストール後に発生する必要がありますが、30日を超えてはなりません。さらに、30日以内に同じアカウントに対して2回のインストールと2回のトラブルコールがあり、その結果が反映されなければなりません。私が抱えている問題は、2つの異なるTrouble Call(TC)と2つの異なるInstall(IN)に一致するTrouble Call(TC)に一致するInstall orderを取得していることです。

SQL Fiddle pay closeインストール注文番号1234567810とトラブル・コール注文番号1234567890に注意してください。問題が表示されます。 http://sqlfiddle.com/#!3/811df/8

select b.accountnumber, 
     MAX(b.scheduleddate) as OriginalDate, 
     b.workordernumber as OriginalOrder, 
     b.jobtype as OriginalType, 
     MIN(a.scheduleddate) as NewDate, 
     a.workordernumber as NewOrder, 
     a.jobtype as NewType 
from (
     select workordernumber,accountnumber,jobtype,scheduleddate 
     from workorders 
     where jobtype = 'TC' 
    ) a join 
    (
     select workordernumber,accountnumber,jobtype,scheduleddate 
     from workorders 
     where jobtype = 'IN' 
    ) b 
on a.accountnumber = b.accountnumber 
group by b.accountnumber, 
     b.scheduleddate, 
     b.workordernumber, 
     b.jobtype, 
     a.accountnumber, 
     a.scheduleddate, 
     a.workordernumber, 
     a.jobtype 
having MIN(a.scheduleddate) > MAX(b.scheduleddate) and 
     DATEDIFF(day,MAX(b.scheduleddate),MIN(a.scheduleddate)) < 31 

私は結果が見えるように探しています何の例。 正しいパスで私を設定するために提供できる支援をありがとう。 enter image description here

答えて

0

実際には非常に近いです。あなたが本当に望んでいるのは、MIN() TCの日付が30日以内である限り、そのアカウント番号のインストール日よりも大きいことです。

実際には、WorkOrderNumberを除いて、結果セットからインストール日までにグループ化する必要があります。何かのように:

SELECT a.AccountNumber, MIN(a.scheduleddate) TCDate, b.scheduleddate INDate 
FROM 
    (
     SELECT WorkOrderNumber, ScheduledDate, JobType, AccountNumber 
     FROM workorders 
     WHERE JobType = 'TC' 
    ) a 
    INNER JOIN 
    (
     SELECT WorkOrderNumber, ScheduledDate, JobType, AccountNumber 
     FROM workorders 
     WHERE JobType = 'IN' 
    ) b 
    ON a.AccountNumber = b.AccountNumber 
WHERE b.ScheduledDate < a.ScheduledDate 
    AND DATEDIFF(DAY, b.ScheduledDate, a.ScheduledDate) <= 30 
GROUP BY a.AccountNumber, b.AccountNumber, b.ScheduledDate 

これは、日付とAccountNumber秒の世話をするが、あなたはまだWorkOrderNumber秒を必要とするので、私は一度、各タイプのため、2回逆workordersテーブルに参加しました。

注:各ワークオーダーには、アカウント番号ごとに固有の日付が設定されているものとします。したがって、2015年1月1日にアカウント1のワークオーダー1( 'TC')があり、 '1/1/2015'にアカウント1の作業オーダー2( '​​TC')がある場合は、あなたの結果セットに正しいWorkOrderNumberがあることを保証しません。

SELECT 
    aggdata.AccountNumber, inst.workordernumber OriginalWorkOrderNumber, inst.JobType OriginalJobType, inst.ScheduledDate OriginalScheduledDate, 
    tc.WorkOrderNumber NewWorkOrderNumber, tc.JobType NewJobType, tc.ScheduledDate NewScheduledDate 
FROM (
     SELECT a.AccountNumber, MIN(a.scheduleddate) TCDate, b.scheduleddate INDate 
     FROM 
      (
       SELECT WorkOrderNumber, ScheduledDate, JobType, AccountNumber 
       FROM workorders 
       WHERE JobType = 'TC' 
      ) a 
      INNER JOIN 
      (
       SELECT WorkOrderNumber, ScheduledDate, JobType, AccountNumber 
       FROM workorders 
       WHERE JobType = 'IN' 
      ) b 
      ON a.AccountNumber = b.AccountNumber 
     WHERE b.ScheduledDate < a.ScheduledDate 
      AND DATEDIFF(DAY, b.ScheduledDate, a.ScheduledDate) <= 30 
     GROUP BY a.AccountNumber, b.AccountNumber, b.ScheduledDate 
    ) aggdata 
    LEFT OUTER JOIN workorders tc 
    ON aggdata.TCDate = tc.ScheduledDate 
     AND aggdata.AccountNumber = tc.AccountNumber 
     AND tc.JobType = 'TC' 
    LEFT OUTER JOIN workorders inst 
    ON aggdata.INDate = inst.ScheduledDate 
     AND aggdata.AccountNumber = inst.AccountNumber 
     AND inst.JobType = 'IN' 

私の最後のクエリは、このように見えました

関連する問題