Недопустимое имя столбца при установке новой переменной, равной выражению

#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. Объяснение, почему это лучше, превратило бы этот хороший ответ в отличный ответ.