2015-12-17 8 views
5

Zayıf konu satırı için özür dilerim.SQL Query, iş emrinin sırasını gösterir

DÜZENLEME: Burada Sorgu Ben OrderNumbers DÜZENLEMEYİ çoğaltmak DEĞİL sorgu ihtiyacı am OrderNumbers kopyalar: soru Kısaltılmış ve iş emirlerinin tüm kaydını olan bir tablo var bir daha temiz bir soru

sağlanan gerçekleştirildi. iki çeşit emir var. Yüklemeler ve Sorun Aramaları. Sorgum, bir yükleme işleminden sonraki 30 gün içinde gerçekleşen tüm sorun çağrılarını bulmak ve bu sorun çağrısını (TC) doğru Kurulum (IN) ile eşleştirmektir. Bu nedenle, Trouble Call tarihi, kurulumdan sonra ancak en geç 30 gün sonra gerçekleşmelidir. Ek olarak, aynı hesap için iki yükleme ve iki sorun çağrısı varsa, hepsi 30 gün içinde gerçekleşir ve sonuçların bunu yansıtması gerekir. Sorun şu ki, iki farklı yükleme (TC) ve iki farklı yüklemelerle (IN) eşleşen bir yükleme sırası (TC) eşleşen bir yükleme sırası (TC) alıyorum (I)

SQL Fiddle ödeme örneğinde kapatın 1234567810 numaralı sipariş numarasına ve 1234567890 numaralı Trouble Call sipariş numarasına dikkat edin ve sahip olduğum sorunu göreceksiniz. 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 

Ben sonuçları gibi görünmek için ne arıyorum örneği. Doğru yolda beni ayarlayabileceğiniz her türlü yardım için teşekkür ederiz. enter image description here

cevap

0

Aslında çok yakındınız. Gerçekten istediğiniz her şeyin, 30 gün veya daha az aralıklı olduğu sürece bu hesap numarası için her bir yükleme tarihinden daha büyük olan MIN() TC tarihinin olduğunu fark ettim.

Gerçekten de, WorkOrderNumber s dışındaki sonuç kümenizden yükleme tarihlerine göre gruplandırmanız gerekiyor. Bir şey gibi:

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 

Bu tarihlerini ve AccountNumber s ilgilenir, ama yine de WorkOrderNumber s gerek, bu yüzden bir kere her türü için geri iki kez workorders tablo katıldı.

Not: Her bir iş örneğinin her hesap numarası için benzersiz bir tarih olduğunu varsayalım. Yani '1/1/2015' tarihinde hesap 1 için iş 1 ('TC') 1 varsa ve '1/1/2015' tarihinde yapılan hesap 1 için de iş emri 2 ('TC') var ise Sonuç kümenizde doğru WorkOrderNumber olduğunu garanti etmeyin.

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' 
:

Benim son sorgu bu benziyordu