#sql #sql-server
#sql #sql-сервер
Вопрос:
Мне нужно вычислить процент на основе двух столбцов в моем запросе и сохранить это число в новой переменной. Когда я устанавливаю переменную, равную выражению, я получаю ошибку «Недопустимое имя столбца».
SELECT
Count(Case When HMC_Place_Position is null Then 0 end) as Parts,
COUNT(*) AS Total_Parts, /*Total Parts */
COUNT(CASE
WHEN Outfeed_Place_Time IS NOT NULL THEN 1
END) AS Total_Good_Parts /*Total Good Parts */
FROM PartData_GKN05_C
WHERE Infeed_Pick_Time >= DATEADD(day,-7, GETDATE())
ALTER TABLE PartData_GKN05_C Add Total_Good_Parts int
DECLARE @Total_Good_Percent AS float = ((Total_Good_Parts / Total_Parts)*100)
Комментарии:
1. Сначала вам нужно объявить переменную, а затем присвоить ей значение в инструкции SELECT.
2. SQL не является языком программирования, не пытайтесь использовать его как таковой.
SELECT
Данные операторов не «сохраняются» после их выполнения; на них можно ссылаться только в инструкции, в которой они определены.3. Выражение case в вашем count не требуется. Просто ПОСЧИТАЙТЕ (Outfeed_Place_Time). Он подсчитывает количество ненулевых значений, поэтому замена значения на 1 ничего не дает, кроме как заставляет вас вводить больше. Но я сомневаюсь в сохранении совокупных данных в той же таблице, что и данные, которые он подсчитывает.
Ответ №1:
Я полагаю, вы хотите получить процент «хороших» частей от общего количества записей частей в PartData_GKN05_C.
Итак, используя ваше определение «хороших деталей» (Outfeed_Place_Time НЕ РАВЕН НУЛЮ), приведенный ниже запрос подсчитывает их, а затем делит на количество всех записей деталей в таблице.
Поскольку «count()» возвращает целочисленное значение, мы должны преобразовать одно из значений «count()» в значение с плавающей точкой, прежде чем мы разделим их, чтобы SQL не возвращал ноль (поскольку «int / int» не возвращает десятичные дроби, в то время как значение с плавающей точкой возвращает).
Нам нужно преобразовать только один из «Count()», потому что SQL неявно преобразует другой, но не стесняйтесь преобразовывать оба в float явно, если хотите.
Вот код :
DECLARE
@Total_Good_Percent float
SELECT
@Total_Good_Percent = (
COUNT(
CASE
WHEN Outfeed_Place_Time IS NOT NULL
THEN 1
END
)
/convert(float,count(*))
)*100
FROM
PartData_GKN05_C
WHERE
Infeed_Pick_Time >= DATEADD(day, -7, GETDATE());
select
@Total_Good_Percent
Ответ №2:
попробуйте этот код:
DECLARE @Total_Good_Parts INT, @Total_Parts INT;
SELECT
--Count(Case When HMC_Place_Position is null Then 0 end) as Parts,
@Total_Parts = COUNT(*),
@Total_Good_Parts = COUNT(CASE
WHEN Outfeed_Place_Time IS NOT NULL
THEN 1
END)
FROM PartData_GKN05_C
WHERE Infeed_Pick_Time >= DATEADD(day, -7, GETDATE());
ALTER TABLE PartData_GKN05_C
ADD Total_Good_Parts INT;
DECLARE @Total_Good_Percent AS FLOAT= ((@Total_Good_Parts / @Total_Parts) * 100.00);
Комментарии:
1. Объяснение, почему это лучше, превратило бы этот хороший ответ в отличный ответ.