我是SQL的新手,很抱歉遇到一些愚蠢的问题。
表将来自以下SQL沙箱: https://www.w3schools.com/sql/trysql.asp?filename=trysql_asc
有格式表
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable, axes_size
arr = np.random.randint(0, 100, (2, 3, 4))
fig, ax = plt.subplots(1, 1)
pax = ax.imshow(arr, vmin=0, vmax=100)
cbar_txt='arb. units'
cbar_kws=dict(ticks=(0, 100))
divider = make_axes_locatable(ax)
cax = divider.append_axes('right', size='5%', pad=0.05)
cbar = ax.figure.colorbar(pax, cax=cax, **dict(cbar_kws))
cbar.set_label(cbar_txt, size = 20)
cbar.ax.tick_params(labelsize = 10)
plt.tight_layout()
plt.show()
我想获得最大平均数量的产品。
我可以使用以下查询来获取它:
OrderDetailID OrderID ProductID Quantity
1 10248 11 12
2 10248 42 10
3 10248 72 5
4 10249 14 9
5 10249 51 40
我在这里两次使用块
SELECT avg.ProductID, avg.Quantity
FROM (
SELECT ProductID, AVG(Quantity) Quantity
FROM OrderDetails
GROUP BY ProductID
) avg
WHERE avg.Quantity = (
SELECT MAX(Quantity) FROM (
SELECT ProductID, AVG(Quantity) Quantity
FROM OrderDetails
GROUP BY ProductID
)
)
ProductID Quantity
8 70
48 70
因为如果我对 SELECT ProductID, AVG(Quantity) Quantity
FROM OrderDetails
GROUP BY ProductID
而不是第二个块使用查询
avg
我收到错误SELECT avg.ProductID, avg.Quantity
FROM (
SELECT ProductID, AVG(Quantity) Quantity
FROM OrderDetails
GROUP BY ProductID
) avg
WHERE avg.Quantity = (SELECT MAX(Quantity) FROM avg)
所以我的问题是:
答案 0 :(得分:4)
使用WITH
子句考虑公用表表达式(CTE),可避免重复和重新计算聚合子查询。大多数RDBMS支持CTE(在SQL TryIt链接页面中完全有效)。
WITH avg AS (
SELECT ProductID, AVG(Quantity) Quantity
FROM OrderDetails
GROUP BY ProductID
)
SELECT avg.ProductID, avg.Quantity
FROM avg
WHERE avg.Quantity = (
SELECT MAX(Quantity) FROM avg
)
答案 1 :(得分:0)
这实际上不是语法问题,而是范围:您尝试 引用不在父子关系中的别名。只有这样,他们才能互相引用。 (标识符是一个别名,而不是变量-这是另一回事。)
一种更简单的方法是在运行过滤条件之前创建一个临时集-如上一个答案那样,使用CTE,也可以尝试使用临时表。它们可以在任何地方使用,因为它们的范围不在子查询中。