2010-10-17 5 views
6

Estoy tratando de realizar una consulta para recuperar la región que obtuvo la mayor cantidad de ventas de productos dulces. 'grupo_produto' es el tipo de producto, y 'regiao' es la región. Así que me dio esta consulta:MS-Access -> SELECCIONAR AS + ORDER BY = error

SELECT TOP 1 r.nm_regiao, (SELECT COUNT(*) 
     FROM Dw_Empresa 
     WHERE grupo_produto='1' AND 
     cod_regiao = d.cod_regiao) as total 
FROM Dw_Empresa d 
INNER JOIN tb_regiao r ON r.cod_regiao = d.cod_regiao ORDER BY total DESC 

Luego, cuando corro la consulta, MS-Access pregunta para el parámetro "total". ¿Por qué no considera la "columna" recién creada que hice en la cláusula de selección?

¡Gracias de antemano!

Respuesta

3

alias son solamente utilizable en la salida de la consulta. No puede usarlos en otras partes de la consulta. Desafortunadamente, tendrás que copiar y pegar toda la subconsulta para que funcione.

+0

No puede usar el alias, pero puede repetir la expresión con alias. Jet lo calculará solo una vez, por lo que solo es ineficiente en lo que respecta a la escritura. –

+0

No en este caso. Obtendrá un error si intenta ordenar por la subconsulta publicada. – Fionnuala

+0

"Los alias solo son útiles en el resultado de la consulta" - No estoy de acuerdo: creo que es muy útil poder usar 'alias' en la cláusula 'ORDER BY'. – onedaywhen

0

Intente usar una subconsulta y ordene los resultados en una consulta externa.

SELECT TOP 1 * FROM 
(
    SELECT 
     r.nm_regiao, 
     (SELECT COUNT(*) 
     FROM Dw_Empresa 
     WHERE grupo_produto='1' AND cod_regiao = d.cod_regiao) as total 
    FROM Dw_Empresa d 
    INNER JOIN tb_regiao r ON r.cod_regiao = d.cod_regiao 
) T1 
ORDER BY total DESC 

(No se ha probado.)

+0

Es extraño. Cuando intento eso, la columna "total" se convierte en 0 y en lugar de aparecer una fila, obtengo 10 filas similares. Estoy tratando de descubrir por qué. Ese es el camino, sin embargo. Gracias –

0

¿Qué tal:

SELECT TOP 1 r.nm_regiao 
FROM (SELECT Dw_Empresa.cod_regiao, 
      Count(Dw_Empresa.cod_regiao) AS CountOfcod_regiao 
     FROM Dw_Empresa 
     WHERE Dw_Empresa.[grupo_produto]='1' 
     GROUP BY Dw_Empresa.cod_regiao 
     ORDER BY Count(Dw_Empresa.cod_regiao) DESC) d 
INNER JOIN tb_regiao AS r 
ON d.cod_regiao = r.cod_regiao 
1

¿Por qué no se considera 'columna' el recién creado que hice en la cláusula select ?

Porque Access (ACE/Jet) no es compatible con el estándar SQL-92.

Considere este ejemplo, que es válido SQL-92:

SELECT a AS x, c - b AS y 
    FROM MyTable 
ORDER 
    BY x, y; 

De hecho, x y y los únicos elementos válidos en la cláusula ORDER BY porque todos los demás están fuera de alcance (números ordinales de las columnas de la SELECT cláusula son válidas aunque su id de uso desaprobado).

Sin embargo, Access ahoga en la sintaxis anterior. La sintaxis de acceso equivalente es la siguiente:

SELECT a AS x, c - b AS y 
    FROM MyTable 
ORDER 
    BY a, c - b; 

Sin embargo, entiendo de @ comentarios de Remou que una subconsulta en la cláusula ORDER BY no es válido en el acceso.

0

Sugiero usar una consulta intermedia.

SELECT r.nm_regiao, d.grupo_produto, COUNT(*) AS total 
    FROM Dw_Empresa d INNER JOIN tb_regiao r ON r.cod_regiao = d.cod_regiao 
    GROUP BY r.nm_regiao, d.grupo_produto; 

Si llama que GroupTotalsByRegion, a continuación, puede hacer:

SELECT TOP 1 nm_regiao, total FROM GroupTotalsByRegion 
    WHERE grupo_produto = '1' ORDER BY total DESC 

Usted puede pensar que es un trabajo extra para crear la consulta intermedia (y, en cierto sentido, lo es), pero se también encontrará que muchas de sus otras consultas se basarán en GroupTotalsByRegion. Desea evitar repetir esa lógica en muchas otras consultas. Al mantenerlo en una vista, proporciona una ruta simplificada para responder a muchas otras preguntas.

+0

No es necesario guárdelo: debería poder usar una tabla derivada en la cláusula FROM en lugar de QueryDef guardado. –

3

Usted puede hacerlo de esta manera

select * from(
    select a + b as c, * from table) 
    order by c 

acceso tiene algunas diferencias en comparación con SQL Server.

10

Pregunta anterior Lo sé, pero puede ayudar a alguien saber que si bien no se puede ordenar por alias, puede ordenar por índice de columna. Por ejemplo, esta funcionará sin error:

SELECT 
firstColumn, 
IIF(secondColumn = '', thirdColumn, secondColumn) As yourAlias 
FROM 
yourTable 
ORDER BY 
2 ASC 

Los resultados serían entonces ser ordenados por los valores encontrados en la segunda wich columna es el "yourAlias" alias.

Cuestiones relacionadas