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:

enter image description here

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 referenciar CountryCodes dentro del PARTITION BY.

    Para corregir esos errores, necesitas agregar co.CountryCodes a la cláusula GROUP BY y corregir la referencia a CountryCodes 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áusula GROUP 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áusula GROUP 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áusula GROUP 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