有没有办法从嵌套查询返回计算值?

时间:2018-03-21 15:38:13

标签: mysql nested-queries

好的我花了一个星期试图解决这个问题,但我似乎无法找到我正在寻找的东西。我认为,有两个类似的问题在看到伪(ish)代码后更容易解释。这是第一个

SELECT P_CODE, P_DESCRIPT, @diff
FROM PRODUCT
WHERE @diff :=
    (SELECT ROUND(ABS(P_PRICE -(SUM(P_PRICE)/COUNT(P_PRICE))),2)
    FROM PRODUCT
    WHERE P_PRICE in
        (SELECT P_PRICE
        FROM PRODUCT));

基本上,我有产品表,我正在尝试返回主键,描述以及产品价格和所有条目的平均价格之间的差异。在类似的说明中,这是第二个问题

SELECT *, @val
FROM LINE
WHERE P_CODE in 
    (SELECT P_CODE
    FROM LINE
    HAVING COUNT(P_CODE) >
    (@val = (SELECT COUNT(*) FROM LINE)/(SELECT COUNT(DISTINCT P_CODE)
    FROM LINE)));

这里我试图从行表(基本上是收据表)中返回所有字段,该条目的产品销售的商品数量多于销售的平均数量

我正在尝试用这些做什么?我正在尝试返回其他值以及我只能使用另一个表中的值计算的计算值(如果不清楚则以列表形式计算)。我不太确定,但也许JOIN声明可能在这里工作?我是mysql的新手,还不太了解如何最好地使用JOIN语句。如果有人能告诉我如何解决这些问题,或者至少指向一个描述如何做到这一点的链接(因为我找不到运气)

2 个答案:

答案 0 :(得分:1)

加入一个返回平均价格的子查询:

SELECT p.p_code, p.p_descript, ROUND(ABS(p.p_price - x.avg_price)) AS price_diff
FROM product AS p
CROSS JOIN (
    SELECT AVG(p_price) AS avg_price
    FROM product
) AS x

请注意,内置AVG()功能,您不需要使用SUM()COUNT()。此外,WHERE p_price in (SELECT p_price FROM product)没有任何意义 - 该测试显然总是正确的。

SELECT l.*
FROM line AS l
JOIN (
    SELECT p_code, COUNT(*) AS code_count
    FROM line
    GROUP BY p_code
) AS l1 ON l.p_code = l1.p_code
JOIN (
    SELECT COUNT(*)/COUNT(DISTINCT p_code) AS avg_count
    FROM line
) AS x ON l1.code_count > x.avg_count

答案 1 :(得分:1)

  

基本上,我有产品表,我正在尝试返回主键,描述以及产品价格与所有条目的平均价格之间的差异

使用MySQL的用户变量会使查询更加困难。

有很多方法可以满足您的需求。

方法一

使用内部选择或子查询

SELECT 
    PRODUCT.P_CODE
    , PRODUCT.P_DESCRIPT
    , ROUND(ABS((PRODUCT.P_PRICE) - (SELECT AVG(PRODUCT_INNER.P_PRICE) FROM PRODUCT AS PRODUCT_INNER)), 2) AS diff
FROM 
    PRODUCT

方法二

使用CROSS JOIN

<强>查询

SELECT 
    PRODUCT.P_CODE
    , PRODUCT.P_DESCRIPT
    , ROUND(ABS(PRODUCT.P_PRICE - product_avg.avg_product_price), 2) AS diff
FROM 
    PRODUCT
CROSS JOIN 
    (SELECT 
         AVG(PRODUCT.P_PRICE) AS avg_product_price
     FROM 
         PRODUCT) AS product_avg