【问题标题】:SQL Query to show order of work ordersSQL查询显示工作订单的顺序
【发布时间】:2016-03-24 00:46:50
【问题描述】:

首先对糟糕的主题行表示抱歉。

编辑:这里的查询重复 OrderNumbers 我需要查询不重复 OrderNumbers 编辑:缩短了问题并提供了一个更清晰的问题

我有一个表格,其中记录了所有已执行的工单。有两种类型的订单。安装和故障呼叫。我的查询是查找在安装后 30 天内发生的所有故障呼叫,并将该故障呼叫 (TC) 与正确的安装 (IN) 匹配。因此,故障呼叫日期必须在安装后发生,但不得超过 30 天。此外,如果在 30 天内对同一帐户进行两次安装和两次故障调用,并且它们的发生是为了结果必须反映这一点。我遇到的问题是我得到一个与两个不同的故障呼叫 (TC) 匹配的安装订单和一个与两个不同的安装 (IN) 匹配的故障呼叫 (TC)

在 SQL Fiddle 的示例中,请密切注意安装订单号 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

我正在寻找的结果的示例。 感谢您提供的任何帮助,帮助我走上正确的道路。

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:
    select in1.accountnumber,
           in1.scheduleddate as OriginalDate,
           in1.workordernumber as OriginalOrder,
           'IN' as OriginalType,
           tc.scheduleddate as NewDate,
           tc.workordernumber as NewOrder,
           'TC' as NewType 
    from 
          workorders in1
          out apply   (Select min(in2.scheduleddate) as scheduleddate  from workorders in2 Where  in2.jobtype = 'IN' and in1.accountnumber=in2.accountnumber and in2.scheduleddate>in1.scheduleddate) ins
          join workorders tc on tc.jobtype = 'TC' and tc.accountnumber=in1.accountnumber and tc.scheduleddate>in1.scheduleddate and (ins.scheduleddate is null or tc.scheduleddate<ins.scheduleddate) and DATEDIFF(day,in1.scheduleddate,tc.scheduleddate) < 31
            Where     in1.jobtype = 'IN'  
    

    【讨论】:

    • 请考虑添加解释为什么您的答案是正确的
    【解决方案2】:

    其实你们很亲近。我意识到您真正想要的是MIN() TC 日期大于该帐号的每个安装日期,只要它们相隔 30 天或更短。

    因此,您确实需要按结果集中的安装日期进行分组,但仍不包括 WorkOrderNumbers。比如:

    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
    

    这会处理日期和AccountNumbers,但您仍然需要WorkOrderNumbers,所以我加入了workorders 表两次,每种类型一次。

    注意:我假设每个工单的每个帐号都有一个唯一的日期。因此,如果您在“2015 年 1 月 1 日”完成了账户 1 的工单 1 (“TC”),并且在“2015 年 1 月 1 日”完成了账户 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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 2017-01-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多