显示工单顺序的SQL查询

显示工单顺序的SQL查询,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,首先,很抱歉我的主题太差了 编辑:这里的查询复制了OrderNumber我需要查询不复制OrderNumber 编辑:缩短了问题,提供了一个更清晰的问题 我有一个表,其中记录了所有已执行的工单。有两种类型的订单。安装和故障呼叫。我的问题是查找安装后30天内发生的所有故障呼叫,并将该故障呼叫TC与正确的install IN匹配。因此,故障呼叫日期必须在安装后发生,但不得超过安装后30天。此外,如果同一个帐户在30天内有两次安装和两次故障呼叫,并且它们是按顺序发生的,则结果必须反映这一点。我遇到的问

首先,很抱歉我的主题太差了

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

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

在SQL Fiddle的示例中,请密切注意安装订单号1234567810和故障呼叫订单号1234567890,您将看到我遇到的问题。

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

事实上,你们非常接近。我意识到,您真正想要的是最小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

请考虑解释为什么你的答案是正确的
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
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'
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'