我正在尝试查询检索甜食产品销售额最多的地区。 '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子句中创建的新列?
提前致谢!
答案 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;
实际上,x
和y
是ORDER 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