Это короткая версия моего 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.
Так может ли кто-нибудь помочь мне, как решить эту проблему?
Для выражения ((CustomsDuties_T + SpecificDuties_T) / (CustomsValue_T))
в вашем CTE ни один из столбцов этого выражения не входит в GROUP BY
и не агрегируется. Как сказал @HoneyBadger, ошибка буквально говорит вам о проблеме. Добавьте их в GROUP BY
или поместите столбцы/выражения в агрегат.
P.S. Личная ненависть к животным. ;
- это терминатор оператора, он идет в конце всех ваших операторов, а не в начале (тех, которые требуют, чтобы предыдущий оператор был правильно завершен). Это не «начинающий» и не пункт ;WITH
.
Всякий раз, когда мы используем агрегатную функцию, столбцы, которые используются в операторе выбора, должны быть в предложении 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
). Конечно, если это так, я бы предположил, что, вероятно, это не более чем типографика.
«Всякий раз, когда мы используем агрегатную функцию, столбцы, которые используются в операторе выбора, должны быть в предложении Group By» * Это также неверно. Только столбцы, которые не агрегированы и на которые есть ссылки в SELECT
, должны быть в предложении GROUP BY
, а не те, которые используются в SELECT
. SELECT Col1, SUM(Col2) FROM dbo.MyTable GROUP BY Col1;
в порядке; Col2
не обязательно должен быть в GROUP BY
.
Я понял, что вы пытаетесь передать, я изменил код, теперь проверьте, пожалуйста - @Larnu
Спасибо @Thiyagu. Эти строки кода действительно работают. Но теперь у меня возникла новая ошибка Msg 8134, уровень 16, состояние 1, строка 306. Разделить на ноль. Интересно, как я могу решить и эту ошибку?
Ошибка довольно ясна, вам нужно либо агрегировать добавленную выборку, либо добавить ее в группу с помощью