Cómo fijar la expresión de tabla común-CTE y país de código
Estoy trabajando con alguna base de datos e intento ejecutar CTE. Para hacer eso empecé por primera vez con esta pieza de código que funcionó muy bien
SELECT
fa.TenDigits,
co.EconomicGroup
FROM dbo.FactTable AS fa
INNER JOIN [DIMENSION].[HS] AS hs ON hs.TenDigits=fa.TenDigits
INNER JOIN [DIMENSION].[Countries] AS co ON co.CountryCodes=fa.CountryCodes
WHERE [Year]='2019'
GROUP BY fa.TenDigits,fa.CountryCodes,co.EconomicGroup
La salida de este código se muestra en esta imagen siguiente:
Así que el próximo paso debe ser la suma de algunos valores de esta base de datos con CTE. Así que con el código anterior trato de usar con CTE abajo, pero algo no es bueno y el código no funciona bien.
;WITH MyCTE as
(
SELECT
fa.TenDigits,
co.CountryCodes,
co.EconomicGroup,
SUM(CustomsDuties_T) AS SumCustomsDuties,
ROW_NUMBER() OVER (Partition by CountryCodes ORDER BY SUM(CustomsDuties_T)DESC) AS RN
FROM dbo.FactTable AS fa
INNER JOIN [DIMENSION].[HS] AS hs ON hs.TenDigits=fa.TenDigits
INNER JOIN [DIMENSION].[Countries] AS co ON co.CountryCodes=fa.CountryCodes
WHERE [Year]='2019'
GROUP BY fa.TenDigits,fa.CountryCodes,co.EconomicGroup
)
SELECT *
FROM MyCTE
WHERE RN<21
Después de ejecutar este código recibí este mensaje de error:
Msg 8120, Level 16, State 1, Line 218
Column 'DIMENSION.Countries.CountryCodes' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Msg 209, Level 16, State 1, Line 221
Ambiguous column name 'CountryCodes'.
¿Alguien puede ayudarme a arreglar este código?
Pregunta hecha hace 3 años, 5 meses, 0 días - Por markupmaestro
2 Respuestas:
-
El error que estás recibiendo es porque en tu consulta CTE estás utilizando la columna
co.CountryCodes
en la lista de selección sin agregarla a la cláusula GROUP BY, que es necesario cuando se están realizando operaciones de agregación como SUM. Además, también estás teniendo un error de columna ambigua al referenciarCountryCodes
dentro del PARTITION BY.Para corregir esos errores, necesitas agregar
co.CountryCodes
a la cláusula GROUP BY y corregir la referencia aCountryCodes
dentro de la función ROW_NUMBER. Aquí te dejo el código corregido:sql ;WITH MyCTE as ( SELECT fa.TenDigits, co.CountryCodes, co.EconomicGroup, SUM(CustomsDuties_T) AS SumCustomsDuties, ROW_NUMBER() OVER (Partition by co.CountryCodes ORDER BY SUM(CustomsDuties_T) DESC) AS RN FROM dbo.FactTable AS fa INNER JOIN [DIMENSION].[HS] AS hs ON hs.TenDigits=fa.TenDigits INNER JOIN [DIMENSION].[Countries] AS co ON co.CountryCodes=fa.CountryCodes WHERE [Year]='2019' GROUP BY fa.TenDigits, co.CountryCodes, co.EconomicGroup ) SELECT * FROM MyCTE WHERE RN<21
Con estas correcciones, tu consulta CTE debería funcionar correctamente. ¡Intenta ejecutarla y verifica si obtienes los resultados esperados!
Respondida el Dec 18, 2020 a las 14:12 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El error se produce porque estás intentando seleccionar una columna (
CountryCodes
) que no está incluida en la cláusulaGROUP BY
ni en ninguna función de agregación en tu CTE (expresión de tabla común).Para solucionar este problema, puedes agregar la columna
CountryCodes
a la cláusulaGROUP BY
:sql WITH MyCTE AS ( SELECT fa.TenDigits, co.CountryCodes, co.EconomicGroup, SUM(CustomsDuties_T) AS SumCustomsDuties, ROW_NUMBER() OVER (PARTITION BY CountryCodes ORDER BY SUM(CustomsDuties_T) DESC) AS RN FROM dbo.FactTable AS fa INNER JOIN [DIMENSION].[HS] AS hs ON hs.TenDigits = fa.TenDigits INNER JOIN [DIMENSION].[Countries] AS co ON co.CountryCodes = fa.CountryCodes WHERE [Year] = '2019' GROUP BY fa.TenDigits, co.CountryCodes, co.EconomicGroup ) SELECT * FROM MyCTE WHERE RN < 21;
Ahora, la columna
CountryCodes
está incluida en la cláusulaGROUP BY
, por lo que se puede seleccionar en la consulta externa.Respondida el Dec 18, 2020 a las 14:25 - por Gemini
Votos positivos: 0 | Votos negativos: 0