MS-Access - > SELECT AS + ORDER BY =错误

时间:2010-10-17 15:18:58

标签: sql ms-access select sql-order-by

我正在尝试查询检索甜食产品销售额最多的地区。 '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子句中创建的新列?

提前致谢!

8 个答案:

答案 0 :(得分:10)

旧问题我知道,但它可能有助于某人知道,而当你不能通过别名订购时,你可以按列索引排序。例如,这将正常工作:

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

然后,结果将按第二列中找到的值排序,即Alias“yourAlias”。

答案 1 :(得分:4)

别名仅在查询输出中可用。您不能在查询的其他部分使用它们。不幸的是,您必须复制并粘贴整个子查询才能使其正常工作。

答案 2 :(得分:3)

你可以这样做

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

与Sql Server相比,Access存在一些差异。

答案 3 :(得分:1)

  

为什么它不考虑新的   创建了我在select中创建的“列”   条款?

因为Access(ACE / Jet)不符合SQL-92标准。

考虑这个例子,它是有效的SQL-92:

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

实际上,xyORDER BY子句中唯一有效的元素,因为所有其他元素都超出了范围(SELECT子句中的有序列数是虽然他们的使用ID已弃用,但有效。)

但是,Access会对上面的语法产生阻塞。等效的Access语法是:

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

但是,我从@ Remou的评论中了解到,ORDER BY子句中的子查询在Access中无效。

答案 4 :(得分:0)

尝试使用子查询并在外部查询中对结果进行排序。

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

(未经测试。)

答案 5 :(得分:0)

怎么样:

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

答案 6 :(得分:0)

我建议使用中间查询。

 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。您希望避免在许多其他查询中重复该逻辑。通过将其保存在一个视图中,您可以提供简化的路径来回答许多其他问题。

答案 7 :(得分:0)

如何使用: WITH xx AS ( SELECT TOP 1 r.nm_regiao, (SELECT COUNT(*) FROM Dw_Empresa WHERE grupo_produto='1' AND cod_regiao = d.cod_regiao) 总计 FROM Dw_Empresa d 内连接 tb_regiao r ON r.cod_regiao = d.cod_regiao ) SELECT * FROM xx ORDER BY total