SQL - не моя сильная сторона, но я работаю над этим - спасибо за ответы.
Я работаю над отчетом, который вернет процент выполнения услуг для частных лиц в наших контрактах. Существует основная таблица «Контракты», каждый отдельный Контракт может иметь несколько услуг из таблицы «услуги», каждая услуга имеет несколько стандартов для таблицы «стандартов», в которой записывается процент выполнения для каждого стандарта.
Я дошел до вычисления общего процента выполнения для каждой отдельной службы для определенного Contract_ServiceID, но как мне вернуть все проценты услуг для всех контрактов? Что-то вроде этого:
Контракт Service NBSP66P66 NBSP66P66N
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 Процент выполнен
Обновлено: таблицы не отображались в сообщении.


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