11
votes

MS-Access -> Sélectionnez As + commande par = erreur

J'essaie de faire une requête pour récupérer la région qui a eu le plus de ventes pour les produits sucrés. 'GRUPO_PRODUTO' est le type de produit et "Regiao" est la région. J'ai donc reçu cette requête: xxx

puis lorsque j'exécute la requête, MS-Access demande le paramètre "Total". Pourquoi cela ne considère pas la "colonne" nouvellement créée dans la clause Select?

Merci d'avance!


0 commentaires

8 Réponses :


0
votes

Essayez d'utiliser une sous-requête et commandez les résultats dans une requête extérieure.

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


1 commentaires

C'est étrange. Lorsque j'essaie que la colonne "totale" devienne tous 0 et au lieu d'une rangée montrant, je reçois 10 rangées similaires. J'essaie de comprendre pourquoi. C'est cependant comme ça. Merci



7
votes

Les alias sont uniquement utilisables dans la sortie de la requête. Vous ne pouvez pas les utiliser dans d'autres parties de la requête. Malheureusement, vous devrez copier et coller toute la sous-requête pour le faire fonctionner.


6 commentaires

Vous ne pouvez pas utiliser l'alias, mais vous pouvez répéter l'expression d'être aliasée. Jet ne le calculera qu'une seule fois, il n'est donc que inefficace en ce qui concerne la frappe.


Pas dans ce cas. Vous obtiendrez une erreur si vous essayez de commander par la sous-requête postée.


"Les alias ne sont utiles que dans la sortie de la requête" - je suis en désaccord: je pense qu'il est très utile de pouvoir utiliser des "alias" dans la clause par .


"Vous ne pouvez pas utiliser [" alias "] dans d'autres parties de la requête" - c'est parce que ces "autres parties" sont résolues avant la clause SELECT . Cependant, la clause par est appliquée après la clause SELECT de sorte que cela ne devrait pas être un problème ... c'est ne devrait pas être mais dans l'accès c'est :(


Les alias sont utiles sur toute la requête, y compris d'autres champs de la liste . J'aurais dû dire "utilisable". Je vais éditer pour clarifier.


Je n'ai pas suffisamment plongé dans le SQL pour le dire, mais je ne suis pas certain que cela nécessite une sous-requête. Il me semble que cela pourrait être faisable d'une jointure sur une table dérivée (c'est-à-dire dans la clause de l'article). Mais comme je le disais, je ne cherche pas aussi étroitement à la SQL.



0
votes

Que diriez-vous:

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


0 commentaires

1
votes

Pourquoi cela ne considère pas le nouveau créé 'colonne' j'ai fait dans la sélection Clause? P>

Parce que l'accès (Ace / Jet) n'est pas conforme à la norme SQL-92. P>

Considérez cet exemple, qui est valide SQL-92: P>

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

0 commentaires

0
votes

Je suggère d'utiliser une requête intermédiaire.

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


1 commentaires

Vous n'êtes pas obligé de le sauvegarder - vous devriez pouvoir utiliser une table dérivée dans la clause de la clause de la requête enregistrée.



4
votes

Vous pouvez le faire comme cet accès

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


0 commentaires

11
votes

Une ancienne question que je connaisse, mais cela peut aider quelqu'un à savoir que pendant que vous ne pouvez pas commander par des alias, vous pouvez commander par index de colonne. Par exemple, cela fonctionnera sans erreur:

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


0 commentaires

0
votes

Que diriez-vous d'utiliser: avec xx comme ( Sélectionnez le top 1 r.nm_regiao (sélectionnez Count (*) De dw_empresa Où grupo_produto = '1' et Cod_regiao = d.cod_regiao) comme total De dw_empresa d Rejoignez interne tb_regiao r sur r.cod_regiao = d.cod_regiao ) Sélectionnez * de xx commander par total


0 commentaires