MS-Access -> ВЫБРАТЬ AS + ORDER BY = ошибка - PullRequest
7 голосов
/ 17 октября 2010

Я пытаюсь сделать запрос, чтобы найти регион, который получил наибольшее количество продаж сладких продуктов.«grupo_produto» - это тип продукта, а «regiao» - регион.Итак, я получил этот запрос:

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

Затем, когда я запускаю запрос, MS-Access запрашивает параметр "total"Почему он не учитывает только что созданный «столбец», который я сделал в предложении select?

Ответы [ 7 ]

12 голосов
/ 16 октября 2013

Старый вопрос. Я знаю, но это может помочь кому-то узнать, что пока вы не можете упорядочить по псевдонимам, вы можете упорядочить по индексу столбца. Например, это будет работать без ошибок:

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

Результаты будут упорядочены по значениям, найденным во втором столбце, который является псевдонимом "yourAlias".

4 голосов
/ 17 октября 2010

Псевдонимы можно использовать только при выводе запроса. Вы не можете использовать их в других частях запроса. К сожалению, вам придется скопировать и вставить весь подзапрос, чтобы он работал.

3 голосов
/ 05 июля 2011

Вы можете сделать это следующим образом

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

Доступ имеет некоторые различия по сравнению с Sql Server.

1 голос
/ 18 октября 2010

Почему это не учитывает недавно создал «столбец» я сделал в избранном пункт

Поскольку Access (ACE / Jet) не соответствует стандарту SQL-92.

Рассмотрим этот пример, действительный SQL-92:

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

Фактически, x и y единственные допустимые элементы в предложении ORDER BY, поскольку все остальные находятся вне области действия (порядковые номера столбцов в предложении SELECT действительны, хотя их идентификатор использования устарел).

Тем не менее, Access блокирует синтаксис выше. Эквивалентный синтаксис Access такой:

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

Однако из комментариев @ Remou я понимаю, что подзапрос в предложении ORDER BY недопустим в Access.

0 голосов
/ 18 октября 2010

Я предлагаю использовать промежуточный запрос.

 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;

Если вы вызываете этот GroupTotalsByRegion, вы можете сделать:

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

Вы можете подумать, что это дополнительная работа по созданию промежуточного запроса (и в некотором смысле это так), но вы также обнаружите, что многие другие ваши запросы будут основаны на GroupTotalsByRegion. Вы хотите избежать повторения этой логики во многих других запросах. Сохраняя его в одном виде, вы предоставляете упрощенный способ ответа на многие другие вопросы.

0 голосов
/ 18 октября 2010

Как насчет:

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 голосов
/ 17 октября 2010

Попробуйте использовать подзапрос и упорядочить результаты во внешнем запросе.

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

(не проверено.)

...