Выполнение CTE: недопустимо в списке выбора

Это короткая версия моего CTE. Вы можете увидеть, как выглядит код:

;WITH MyCTE as
(
    SELECT 
        SUM(CustomsValue_T) AS SumCustomsValue,
        SUM(CustomsDuties_T) AS SumCustomsDuties,
        SUM(SpecificDuties_T) AS SumSpecificDuties,
        SUM(CustomsDuties_T+SpecificDuties_T) AS SumTotalCustomsDuties
    FROM 
        [FACT].ImportDuties AS fa
    GROUP BY 
        fa.TenDigits
)
SELECT *
FROM MyCTE
GO

Так что этот код работает хорошо. Но когда я пытаюсь добавить одну дополнительную переменную, например WeightedCustomsRate, у меня возникают проблемы с выполнением кода. Вы можете увидеть, как выглядит код

;WITH MyCTE as
(
    SELECT 
        SUM(CustomsValue_T) AS SumCustomsValue,
        SUM(CustomsDuties_T) AS SumCustomsDuties,
        SUM(SpecificDuties_T) AS SumSpecificDuties,
        SUM(CustomsDuties_T+SpecificDuties_T) AS SumTotalCustomsDuties
        ((CustomsDuties_T + SpecificDuties_T) / (CustomsValue_T)) * 100 AS WeightedCustomsRate
    FROM 
        [FACT].ImportDuties AS fa
    GROUP BY 
        fa.TenDigits
) 
SELECT *
FROM MyCTE
GO

После выполнения этого кода ошибка

Сообщение 8120, уровень 16, состояние 1, строка 277
Столбец «FACT.ImportDuties.CustomsDuties_T» недействителен в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

Сообщение 8120, уровень 16, состояние 1, строка 277
Столбец «FACT.ImportDuties.SpecificDuties_T» недействителен в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

Сообщение 8120, уровень 16, состояние 1, строка 277
Столбец «FACT.ImportDuties.CustomsValue_T» недействителен в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

Так может ли кто-нибудь помочь мне, как решить эту проблему?

Ошибка довольно ясна, вам нужно либо агрегировать добавленную выборку, либо добавить ее в группу с помощью

HoneyBadger 21.12.2020 10:38

Для выражения ((CustomsDuties_T + SpecificDuties_T) / (CustomsValue_T)) в вашем CTE ни один из столбцов этого выражения не входит в GROUP BY и не агрегируется. Как сказал @HoneyBadger, ошибка буквально говорит вам о проблеме. Добавьте их в GROUP BY или поместите столбцы/выражения в агрегат.

Thom A 21.12.2020 10:40

P.S. Личная ненависть к животным. ; - это терминатор оператора, он идет в конце всех ваших операторов, а не в начале (тех, которые требуют, чтобы предыдущий оператор был правильно завершен). Это не «начинающий» и не пункт ;WITH.

Thom A 21.12.2020 10:42
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
3
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Всякий раз, когда мы используем агрегатную функцию, столбцы, которые используются в операторе выбора, должны быть в предложении Group By*.

;WITH MyCTE as
(
SELECT 
    SUM(CustomsValue_T) AS SumCustomsValue,
    SUM(CustomsDuties_T) AS SumCustomsDuties,
    SUM(SpecificDuties_T) AS SumSpecificDuties,
    SUM(CustomsDuties_T+SpecificDuties_T) AS SumTotalCustomsDuties,
    ((CustomsDuties_T + SpecificDuties_T) / (CustomsValue_T)) * 100 AS WeightedCustomsRate
FROM 
    [FACT].ImportDuties AS fa
GROUP BY 
    fa.TenDigits,CustomsDuties_T,SpecificDuties_T,CustomsValue_T
 ) 
 SELECT *
 FROM MyCTE
 GO

ИЛИ

;WITH MyCTE as
(
SELECT 
    SUM(CustomsValue_T) AS SumCustomsValue,
    SUM(CustomsDuties_T) AS SumCustomsDuties,
    SUM(SpecificDuties_T) AS SumSpecificDuties,
    SUM(CustomsDuties_T+SpecificDuties_T) AS SumTotalCustomsDuties,
    SUM((CustomsDuties_T + SpecificDuties_T) / (CustomsValue_T)) * 100 AS WeightedCustomsRate
FROM 
    [FACT].ImportDuties AS fa
GROUP BY 
    fa.TenDigits
 ) 
 SELECT *
 FROM MyCTE
 GO

Это делает агрегатные функции несколько бессмысленными. Если вы агрегируете CustomsDuties_T, SpecificDuties_T и CustomsValue_T, вы, вероятно, не хотите их видеть в GROUP BY. Скорее всего, OP нуждается в какой-то агрегации их выражения. Скорее всего, это SUM, которое они пропустили (поскольку в предыдущем выражении есть SUM). Конечно, если это так, я бы предположил, что, вероятно, это не более чем типографика.

Thom A 21.12.2020 10:46

«Всякий раз, когда мы используем агрегатную функцию, столбцы, которые используются в операторе выбора, должны быть в предложении Group By» * Это также неверно. Только столбцы, которые не агрегированы и на которые есть ссылки в SELECT, должны быть в предложении GROUP BY, а не те, которые используются в SELECT. SELECT Col1, SUM(Col2) FROM dbo.MyTable GROUP BY Col1; в порядке; Col2 не обязательно должен быть в GROUP BY.

Thom A 21.12.2020 10:50

Я понял, что вы пытаетесь передать, я изменил код, теперь проверьте, пожалуйста - @Larnu

Thiyagu 21.12.2020 10:50

Спасибо @Thiyagu. Эти строки кода действительно работают. Но теперь у меня возникла новая ошибка Msg 8134, уровень 16, состояние 1, строка 306. Разделить на ноль. Интересно, как я могу решить и эту ошибку?

silent_hunter 21.12.2020 10:55

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