Вложенный оператор SELECT - PullRequest
       4

Вложенный оператор SELECT

3 голосов
/ 24 сентября 2008

SQL не моя сильная сторона, но я работаю над этим - спасибо за ответы.

Я работаю над отчетом, который будет возвращать процент выполнения услуг для частных лиц в наших контрактах. Существует основная таблица «Контракты», каждый отдельный Контракт может иметь несколько сервисов из таблицы «сервисов», каждый сервис имеет несколько стандартов для таблицы «стандартов», в которой записывается процент выполнения для каждого стандарта.

Я дошел до того, что вычислил общий процент выполнения для каждой отдельной услуги для конкретного Contract_ServiceID, но как мне вернуть все проценты услуг для всех контрактов? Как то так:

Процент выполнения контракта


обслуживание компании abc 1 98%
обслуживание компании abc 2 100%
xyz Сервис компании 1 50%

Вот что у меня есть:
SELECT  
    Contract_ServiceId, 
    (SUM(CompletionPercentage)/COUNT(CompletionPercentage)) * 100 as "Percent Complete"     
FROM    dbo.Standard sta WITH (NOLOCK) 
        INNER JOIN dbo.Contract_Service conSer ON sta.ServiceId = conSer.ServiceId
        LEFT OUTER JOIN dbo.StandardResponse standResp ON sta.StandardId = standResp.StandardId 
            AND conSer.StandardReportId = standResp.StandardReportId

WHERE Contract_ServiceId = '[an id]'
GROUP BY Contract_ServiceID

Меня это тоже достает:

Contract_serviceid Процент выполнения


[идентификатор] 100%

РЕДАКТИРОВАТЬ: таблицы не отображаются в сообщении.

Ответы [ 6 ]

1 голос
/ 24 сентября 2008

В дополнение к удалению предложения where и добавлению дополнительных групповых условий вы также захотите следить за нулевыми записями в каждой из ваших таблиц. Это требует замены INNER JOIN на LEFT JOIN (если вы не хотите видеть эти строки) и некоторых ISNULL для очистки данных. Я не уверен, где здесь лежит понятие StandardReportId, но оно похоже на механизм фильтрации, с которым я не буду играть.

SELECT  
    ContractID
    ISNULL(Contract_ServiceId, '-1') -- or some other stand in value
    ISNULL((SUM(CompletionPercentage)/COUNT(CompletionPercentage)) * 100, 0) as "Percent Complete"         
FROM    
    Contract AS con
    LEFT OUTER JOIN dbo.Contract_Service conSer ON con.ContractID = conSer.ContractID
    LEFT OUTER JOIN dbo.Standard sta WITH (NOLOCK) ON conSer.ServiceId = sta.StandardID
    LEFT OUTER JOIN dbo.StandardResponse standResp ON sta.StandardId = standResp.StandardId 
        AND conSer.StandardReportId = standResp.StandardReportId
GROUP BY 
    ContractID, Contract_ServiceID
1 голос
/ 24 сентября 2008

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

Просто присоединитесь к таблице Contract , чтобы показать контракт, связанный с каждой услугой, и все готово.

1 голос
/ 24 сентября 2008

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

SELECT con.ContractId, 
       con.Contract,
       conSer.Contract_ServiceID,
       conSer.Service, 
       (SUM(CompletionPercentage)/COUNT(CompletionPercentage)) * 100 as "Percent Complete"         
FROM    dbo.Standard sta WITH (NOLOCK) 
        INNER JOIN dbo.Contract_Service conSer ON sta.ServiceId = conSer.ServiceId
        INNER JOIN dbo.Contract con ON con.ContractId = conSer.ContractId
        LEFT OUTER JOIN dbo.StandardResponse standResp ON sta.StandardId = standResp.StandardId 
                AND conSer.StandardReportId = standResp.StandardReportId
GROUP BY con.ContractId, con.Contract, conSer.Contract_ServiceID, conSer.Service

убедитесь, что у вас есть все столбцы, выбранные из таблицы контрактов в группе по пункту

1 голос
/ 24 сентября 2008

Вы должны иметь возможность добавить в свой выбор название компании и группы по этому и идентификатору сервиса и отказаться от предложения where ...

Возможно, вот так:

SELECT  
    Contract,
    Contract_ServiceId, 
    (SUM(CompletionPercentage)/COUNT(CompletionPercentage)) * 100 as "Percent Complete"         
FROM    dbo.Standard sta WITH (NOLOCK) 
        INNER JOIN dbo.Contract_Service conSer ON sta.ServiceId = conSer.ServiceId
        LEFT OUTER JOIN dbo.StandardResponse standResp ON sta.StandardId = standResp.StandardId 
                AND conSer.StandardReportId = standResp.StandardReportId
GROUP BY Contract, Contract_ServiceID
0 голосов
/ 24 сентября 2008
(SUM(CompletionPercentage)/COUNT(CompletionPercentage)) * 100 

Если CompletionPercentage является полем типа int, у вас будут проблемы с целочисленной математикой. Каждый раз, когда вы делите на целое число, вам нужно умножить его на 1,0, чтобы убедиться, что оно считает число десятичным. В противном случае 49/100 будет = 0.

0 голосов
/ 24 сентября 2008

Поскольку вы группируете по контракту serviceid, я думаю, что вы можете просто удалить пункт where, и он должен рассчитать процент для всех контактных сервисных сервисов.

Если в dbo.Standard нет записей для этого serviceid контракта, вам может потребоваться оставить внешнее объединение вместо таблицы обслуживания контракта в таблице dbo.Standard, чтобы показать контракты без записей о завершении.

Надеюсь, это имеет смысл ... Мой SQL становится ржавым после перехода на платформу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...