Выполненный мной запрос возвращает 2 из того же столбца, который не разрешен в таблице, и я не могу исправить запрос - PullRequest
0 голосов
/ 12 июня 2019

Мне нужно избавиться от одной из рабочих дат и одного из столбцов sr_name, но я не могу понять, как это сделать.

Я получаю запрос, возвращаемый так: Запрос

Я также получаю это сообщение об ошибке при вводе в таблицу:

   The column 'sr_name' was specified multiple times for 'Custom SQL Query'.

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

select * 
from
(
select s.sr_name, cast(punchdatetime as date) as workdate,
    ((datediff(second, min(case when p.InOut = 1 then punchdatetime end), 
    max(case when p.InOut = 0 then punchdatetime end))/3600) - .5) as 
    hoursworked
    from PunchClock p join ServiceReps s on p.ServRepID = s.ServRepID
    where punchyear >= 2019
    group by s.sr_name, cast(punchdatetime as date)
    ) v

join 
    (
    select sr_name, t.*,
    calls = (select count(*) from CRM_Correspondence cr where 
    cast(cr.DateCreated as date) = workdate and StatusType like '%call%' and 
    cr.ServRepID = t.servrepid),
    reaches = (select count(*) from CRM_Correspondence cr where 
    cast(cr.DateCreated as date) = workdate and (StatusType = 'call reached' 
    or StatusType like '%SCHEDULE%') and cr.ServRepID = t.servrepid),
    books = (select count(*) from os_appointments o where cast(o.DateCreated 
    as date) = workdate  and isnull(o.confirmedby, o.booked_by) = 
    t.servrepid),
    attends = (select count(*) from os_appointments o where 
    cast(o.DateCreated as date) = workdate  and isnull(o.confirmedby, 
    o.booked_by) = t.servrepid and o.appointmentStatus = 'attended')

from
    (
    select cast(cor.datecreated as date) workdate, cor.ServRepID
    from CRM_Correspondence cor
    where cor.datecreated > '2019-01-01'
    group by cast(cor.datecreated as date), cor.servrepid
    ) t
join ServiceReps sr on t.ServRepID = sr.ServRepID
) u on v.sr_name = u.sr_name and v.workdate = u.workdate

Мне нужны те же результаты, только без дублирующего столбца, чтобы я мог ввести запрос в таблицу.

1 Ответ

2 голосов
/ 12 июня 2019

Это сложно, потому что у вас здесь так много подзапросов.Это может быть реорганизовано для использования одного запроса, что я и сделаю.Но используя существующий запрос, вы можете сделать что-то в этом духе.

Мне пришлось отформатировать это очень по-разному, чтобы я мог выделить каждый фрагмент.

select v.sr_name
    , v.workdate
    , v.hoursworked
    , u.ServRepID
    , u.calls
    , u.reaches
    , u.books
    , u.attends
from
(
    select s.sr_name
        , cast(punchdatetime as date) as workdate
        , ((datediff(second, min(case when p.InOut = 1 then punchdatetime end), max(case when p.InOut = 0 then punchdatetime end))/3600) - .5) as hoursworked
    from PunchClock p 
    join ServiceReps s on p.ServRepID = s.ServRepID
    where punchyear >= 2019
    group by s.sr_name
        , cast(punchdatetime as date)
) v
join 
(
    select sr_name
        , t.*
        , calls = 
                (
                    select count(*) 
                    from CRM_Correspondence cr 
                    where cast(cr.DateCreated as date) = workdate 
                        and StatusType like '%call%' 
                        and cr.ServRepID = t.servrepid
                )
        , reaches = 
                (
                    select count(*) 
                    from CRM_Correspondence cr 
                    where cast(cr.DateCreated as date) = workdate 
                        and (StatusType = 'call reached' or StatusType like '%SCHEDULE%') 
                        and cr.ServRepID = t.servrepid
                )
        , books = 
                (
                    select count(*) 
                    from os_appointments o 
                    where cast(o.DateCreated as date) = workdate  and isnull(o.confirmedby, o.booked_by) = t.servrepid
                )
        , attends = 
                (
                    select count(*) 
                    from os_appointments o 
                    where cast(o.DateCreated as date) = workdate
                        and isnull(o.confirmedby, o.booked_by) = t.servrepid 
                        and o.appointmentStatus = 'attended'
                )
    from
    (
        select cast(cor.datecreated as date) workdate
            , cor.ServRepID
        from CRM_Correspondence cor
        where cor.datecreated > '2019-01-01'
        group by cast(cor.datecreated as date)
            , cor.servrepid
    ) t
    join ServiceReps sr on t.ServRepID = sr.ServRepID
) u on v.sr_name = u.sr_name 
    and v.workdate = u.workdate
...