2010-10-17 13 views
6

Sto provando a fare una query per recuperare la regione che ha ottenuto il maggior numero di vendite di prodotti dolci. "grupo_produto" è il tipo di prodotto e "regiao" è la regione. Quindi ho ottenuto questa query:MS-Access -> SELECT AS + ORDER BY = errore

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 

Quindi quando eseguo la query, MS-Access richiede il parametro "totale". Perché non considera la "colonna" appena creata nella clausola select?

Grazie in anticipo!

risposta

3

alias sono utilizzabili solo in uscita query. Non è possibile utilizzarli in altre parti della query. Sfortunatamente, dovrai copiare e incollare l'intera sottoquery per farlo funzionare.

+0

Non è possibile utilizzare l'alias, ma è possibile ripetere l'espressione di alias. Jet lo calcolerà solo una volta, quindi è solo inefficiente per quanto riguarda la digitazione. –

+0

Non in questo caso. Si verificherà un errore se si tenta di ordinare dalla subquery pubblicata. – Fionnuala

+0

"Gli alias sono utili solo nell'output della query" - Non sono d'accordo: penso che sia molto utile poter usare "alias" nella clausola 'ORDER BY'. – onedaywhen

0

Provare a utilizzare una sottoquery e ordinare i risultati in una query esterna.

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 

(non testato.)

+0

È strano. Quando provo a farlo, la colonna "totale" diventa tutto 0 e invece di una riga che mostra, ottengo 10 righe simili. Sto cercando di capire perché. Questo è il modo, però. Grazie –

0

ne dite:

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

Perché non considera la 'colonna' di nuova creato ho fatto nel selezionare clausola?

Perché Access (ACE/Jet) non è compatibile con lo standard SQL-92.

consideri questo esempio, valido SQL-92:

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

Infatti, x e y gli unici elementi validi nella clausola ORDER BY perché tutti gli altri sono fuori portata (numeri ordinali delle colonne della La clausola SELECT è valida anche se il loro ID di utilizzo è deprecato).

Tuttavia, l'accesso si verifica sulla sintassi precedente. La sintassi di accesso equivalente è questo:

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

Tuttavia, ho capito da @ commenti di Remou che una sottoquery nella clausola ORDER BY non è valida in Access.

0

Suggerisco di utilizzare una query 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; 

Se chiamate che GroupTotalsByRegion, quindi è possibile fare:

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

Si può pensare che sia un lavoro extra per creare la query intermedio (e, in un certo senso, lo è), ma si inoltre scopri che molte delle tue altre query si baseranno su GroupTotalsByRegion. Vuoi evitare di ripetere quella logica in molte altre domande. Mantenendolo in un'unica visualizzazione, fornisci un percorso semplificato per rispondere a molte altre domande.

+0

Non è necessario salvalo: dovresti essere in grado di utilizzare una tabella derivata nella clausola FROM al posto di QueryDef salvato. –

3

si può fare in questo modo

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

Access ha alcune differenze rispetto a SQL Server.

10

Vecchia domanda Lo so, ma può aiutare qualcuno a sapere che se non si ordina per alias, è possibile ordinare per indice di colonna. Ad esempio, questo funziona senza l'errore:

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

I risultati sarebbero quindi ordinate i valori trovati nella seconda colonna goduto è il "yourAlias" alias.

Problemi correlati