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

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

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

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

Контракт           Service        NBSP66P66 NBSP66P66N


abc Company   service 1        98%
abc Company   service 2      100%
xyz Company   service 1        50%

Here's what I have so far:
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      Процент выполнен


[an id]                        100%

Обновлено: таблицы не отображались в сообщении.

Можете ли вы опубликовать структуру таблиц задействованных таблиц или, по крайней мере, соответствующие поля? Это поможет нам понять, как сформулировать ваш запрос.

Dana 24.09.2008 19:57
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
1
2 042
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вы должны иметь возможность добавить в свой выбор название компании и группу по этому и идентификатору службы и отказаться от предложения 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
Ответ принят как подходящий

Я не уверен, понимаю ли я проблему, если результат подходит для 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

убедитесь, что у вас есть все столбцы, выбранные из таблицы «Контракт» в предложении group by

Предполагая, что ваш запрос работает только для одной службы, похоже, что вы почти все, оставьте предложение ГДЕ, чтобы получить все результаты, ваш ГРУППА ПО позаботится об одной службе для каждого результата.

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

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

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

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

В дополнение к удалению предложения 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

(SUM(CompletionPercentage)/COUNT(CompletionPercentage)) * 100 

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

Другие вопросы по теме