Не удается связать идентификатор нескольких частей: несколько соединений с помощью Select

Я пытаюсь выполнить запрос, который вернет список заявок, которые открыты и разрешены из нашей системы заявок инженером для служб отчетов.

В настоящее время у нас есть запрос, который делает это, без привлечения инженера; поэтому я пытаюсь вернуться из этого, и я думаю, что я почти там, но я столкнулся с проблемой (я довольно плохо знаком с SQL)

Я получаю сообщение об ошибке: сообщение 4104, уровень 16, состояние 1, строка 9 Не удалось связать идентификатор из нескольких частей «au.FIRST_NAME».

Я думаю, что это так, как я включил объединения для wos.OWNERID и au.USER_ID в другие объединения, но при попытке использовать левое внешнее объединение после всех других или до этого я получаю ошибку из-за неправильного синтаксиса в последнее где заявление.

Соответствующие подробности таблицы следующие:

AAAUSER TABLE

USER_ID     FIRST_NAME
1           System
2           $DEPT_HEAD$
3           Guest

ТАБЛИЦА РАБОЧЕГО СОСТОЯНИЯ

WORKORDERID OWNERID
226     84161
521297      84161
521968      94

Запрос ниже (Обратите внимание, что каждая таблица, исключая «Измерение даты», находится в базе данных ServiceDesk, в отличие от базы данных ServiceDeskExtras в начале запроса.

select
    dd.[Date] 'Date'
    ,format(dd.date,'dd/MM/yyyy','en-gb') 'DisplayDate'
    ,Logged.Tickets 'Tickets Logged'
    ,Closed.Tickets 'Tickets Resolved'
    ,count(OpenTickets.Tickets) 'Open Tickets'
    ,au.FIRST_NAME 'Technician'
from
    ServiceDeskExtras.dbo.DateDimension dd
    left join (
        select
            convert(date,dateadd(s,convert(bigint,wo.CREATEDTIME)/1000,convert(datetime,Ƈ-1-1970'))) 'Date'
            ,count(wo.workorderid) 'Tickets'
        from
            WorkOrder wo
            join AccountSiteMapping asm on wo.SITEID = asm.SITEID
            join AccountDefinition ad on asm.ACCOUNTID = ad.ORG_ID
            left join WORKORDERDELETEHISTORY wodh on wo.WORKORDERID = wodh.WORKORDERID
            join WorkOrderStates wos on wo.WORKORDERID = wos.WORKORDERID
            join AaaUser au on wos.OWNERID = au.USER_ID
            join PriorityDefinition pd on wos.PRIORITYID = pd.PRIORITYID
            join requesttypedefinition rtd on wos.requesttypeid = rtd.requesttypeid
            --join SDOrganization sdo on wo.SITEID = sdo.ORG_ID
            --join SiteDefinition sd on wo.SITEID = sd.SITEID
            --join RegionDefinition rd on sd.REGIONID = rd.REGIONID
        where
            ad.ORG_NAME = 'CUSTOMER NAME'
            and pd.PRIORITYNAME in ('P1','P2','P3','P4')
            and wodh.WORKORDERID is null
            and rtd.name <> 'Automatic Monitoring'
        group by
            convert(date,dateadd(s,convert(bigint,wo.CREATEDTIME)/1000,convert(datetime,Ƈ-1-1970')))
    ) Logged on dd.[Date] = Logged.Date
    left join (
        select
            convert(date,dateadd(s,convert(bigint,wo.resolvedtime)/1000,convert(datetime,Ƈ-1-1970'))) 'Date'
            ,count(wo.workorderid) 'Tickets'
        from
            WorkOrder wo
            join AccountSiteMapping asm on wo.SITEID = asm.SITEID
            join AccountDefinition ad on asm.ACCOUNTID = ad.ORG_ID
            left join WORKORDERDELETEHISTORY wodh on wo.WORKORDERID = wodh.WORKORDERID
            join WorkOrderStates wos on wo.WORKORDERID = wos.WORKORDERID
            join AaaUser au on wos.OWNERID = au.USER_ID
            join PriorityDefinition pd on wos.PRIORITYID = pd.PRIORITYID
            join requesttypedefinition rtd on wos.requesttypeid = rtd.requesttypeid
            --join SDOrganization sdo on wo.SITEID = sdo.ORG_ID
            --join SiteDefinition sd on wo.SITEID = sd.SITEID
            --join RegionDefinition rd on sd.REGIONID = rd.REGIONID
        where
            ad.ORG_NAME = 'CUSTOMER NAME'
            and pd.PRIORITYNAME in ('P1','P2','P3','P4')
            and wodh.WORKORDERID is null
            and rtd.name <> 'Automatic Monitoring'
        group by
            convert(date,dateadd(s,convert(bigint,wo.resolvedtime)/1000,convert(datetime,Ƈ-1-1970')))
    ) Closed on dd.date = Closed.Date
    left join (
        select
            wo.workorderid 'Tickets'
            ,dateadd(s,wo.CREATEDTIME/1000,convert(datetime,Ƈ-1-1970')) 'Logged'
            ,dateadd(s,wo.resolvedtime/1000,convert(datetime,Ƈ-1-1970')) 'Resolved'
        from
            workorder wo
            join AccountSiteMapping asm on wo.SITEID = asm.SITEID
            join AccountDefinition ad on asm.ACCOUNTID = ad.ORG_ID
            left join WORKORDERDELETEHISTORY wodh on wo.WORKORDERID = wodh.WORKORDERID
            join WorkOrderStates wos on wo.WORKORDERID = wos.WORKORDERID
            join AaaUser au on wos.OWNERID = au.USER_ID
            join PriorityDefinition pd on wos.PRIORITYID = pd.PRIORITYID
            join requesttypedefinition rtd on wos.requesttypeid = rtd.requesttypeid
            --join SDOrganization sdo on wo.SITEID = sdo.ORG_ID
            --join SiteDefinition sd on wo.SITEID = sd.SITEID
            --join RegionDefinition rd on sd.REGIONID = rd.REGIONID
        where
            ad.ORG_NAME = 'CUSTOMER NAME'
            and pd.PRIORITYNAME in ('P1','P2','P3','P4')
            and wodh.WORKORDERID is null
            and rtd.name <> 'Automatic Monitoring'
    ) OpenTickets on dateadd(dd,1,dd.date) > OpenTickets.Logged and (dateadd(dd,1,dd.date) <= OpenTickets.Resolved or datediff(dd,convert(datetime,Ƈ-1-1970'),opentickets.resolved) = 0)

where
    dd.[Date] >= dateadd(d,-7,@date)
    and dd.[Date] < @date
group by
     dd.[Date]
     ,logged.Tickets
     ,closed.Tickets
order by
    dd.[Date]

Ожидаемый результат будет для техников, чтобы перечислить в том же столбце, чтобы я мог добавить в отчет Заявки, зарегистрированные против тех, кто решен.

Любая помощь очень ценится - я хочу понять, где мне нужно разместить это в запросе, чтобы я знал в будущем, как правильно отформатировать это!

Спасибо энди

Всего 1 ответ


Я думаю, что вы немного запутались с запросом, который у вас есть, и результатом, которого вы хотите достичь.

  1. Вы помещаете au.FIRST_NAME «Техник» в глобальный список SELECT, что приводит к сбою MS SQL, и это правильно, поскольку в глобальном FROM такого псевдонима нет. Global From знает только о следующих наборах данных: dd, Logged, Closed и OpenTickets. Так что никакой ау здесь нет.
  2. Доступ к au.FIRST_NAME возможен только на уровне подзапроса каждого левого соединения ()
  3. Ваше текущее левое объединение не предоставляет au.FIRST_NAME глобальному FROM, поскольку они не включены в список SELECT каждого левого объединения. Чтобы включить их в список SELECT каждого левого объединения, их также необходимо поместить в предложение GROUP BY.
  4. Но, тем не менее, если вы реализуете предыдущий пункт, у вас не будет только одного FIRST_NAME 'Техника' для трех левых соединений, которые вы делаете, потому что в этом сценарии у вас будет 3 FIRST_NAME для каждого левого объединения: Logged.FIRST_NAME, Closed.FIRST_NAME, OpenTickets.FIRST_NAME.

Если вы хотите видеть закрытые и открытые заявки по каждому техническому специалисту, то, я думаю, вы должны получить технические данные (user_id, name) из Logged join и затем использовать user_id для объединения открытых и закрытых объединений, но имейте в виду, что user_id должен появиться в select список и группировка по предложению каждого подзапроса


Есть идеи?

10000