【问题标题】:Is there a way to sum a product of two columns in MySQL? [duplicate]有没有办法在 MySQL 中对两列的乘积求和? [复制]
【发布时间】:2016-12-23 06:14:56
【问题描述】:

这是我的桌子:

-- receipts
| id | date       |
|----|------------|
| 1  | 2016-12-20 |
| 2  | 2016-12-20 |
| 3  | 2016-12-21 |

-- purchases
| id | receipt_id | item        | price | tax_rate |
|----|------------|-------------|-------|----------|
| 1  | 1          | apples      |  3.89 | 0.000    |
| 2  | 1          | canned soup |  2.99 | 0.095    |
| 3  | 1          | candy bar   |  0.99 | 0.095    |
| 4  | 2          | gas         | 26.78 | 0.000    |
| 5  | 3          | chips       |  3.99 | 0.095    |
| 6  | 3          | dip         |  2.99 | 0.095    |

我正在尝试执行一个查询,该查询从收据表中返回 3 个项目,其中包括小计、总税款和总计。到目前为止,这就是我所拥有的 SQL。

SELECT 
    receipts.id, 
    receipts.date, 
    SUM(purchases.price) AS subtotal, 
    SUM(purchases.price * purchases.tax_rate) AS tax,
    SUM(subtotal + tax_rate)
FROM receipts
RIGHT JOIN purchases ON purchases.receipt_id = receipts.id;

最终结果应该是这样的:

| id | date       | subtotal | tax  | total |
|----|------------|----------|------|-------|
| 1  | 2016-12-20 |  7.87    | 0.38 |  8.25 |
| 2  | 2016-12-20 | 26.78    | 0.00 | 26.78 |
| 3  | 2016-12-21 |  6.98    | 0.66 |  7.64 |

【问题讨论】:

  • 你有什么问题?
  • SUM(subtotal + tax) 给了我一个错误,上面写着Unknown column 'subtotal' in 'field list' 如果我删除那个我得到的,我没有得到任何错误,但它只是返回第一行并将整列相加一行。
  • 您不能在同一查询中引用字段别名。您要么需要将其放入子查询中,要么重复该别名的计算。

标签: mysql join sum


【解决方案1】:

这看起来像是INNER JOIN 的情况,您需要GROUP BYreceipt_id。其余的看起来都很好,除了 shmosel 已经回答了。

SELECT 
    receipts.id, 
    receipts.date, 
    SUM(purchases.price) AS subtotal, 
    SUM(purchases.price * purchases.tax) AS tax,
    SUM(purchases.price) + SUM(purchases.price * purchases.tax) AS total
FROM receipts
INNER JOIN purchases ON purchases.receipt_id = receipts.id
GROUP BY receipt_id

mysql不知道生成的别名,每次select都需要在select子句中写计算,希望mysql能正确处理,不要计算两次。

【讨论】:

  • INNER JOIN 有效,但它也适用于RIGHT JOIN。但不使用别名并通过使其正常工作来添加组。
  • INNER JOIN 是您要查找的内容,因为如果您使用 RIGHT JOIN 并在程序中进一步处理数据,则会导致错误。通常,没有购买就不可能有收据,反之亦然。 INNER JOIN 仅查找“有效”条目,同时具有收据和购买。 @MakPo
  • @baao - 正如现在所写的那样,您的 SQL 语句无效,因为您既没有聚合也没有按收据分组。 Caleb Haldane's answer 更正确,更好地解释了聚合数据的要求。
  • 不需要按两列分组。 @andymerts
  • 我错过了这是允许的 MySQL。我的立场是正确的。
【解决方案2】:

你快到了。由于您想要聚合您的结果,您需要使用聚合函数 SUM(您已经完成),但是当您使用 SUM 时,您需要告诉查询您希望如何聚合数据。您可以通过添加 Group By 语句来做到这一点。

SELECT 
    receipts.id, 
    receipts.date, 
    SUM(purchases.price) AS subtotal, 
    SUM(purchases.price * purchases.tax) AS tax,
    SUM(purchases.price) + SUM(purchases.price * purchases.tax) AS total
FROM receipts
RIGHT JOIN purchases ON purchases.receipt_id = receipts.id;
GROUP BY receipts.id, receipts.date

【讨论】:

    【解决方案3】:

    第三个SELECT值应该是

    SUM(purchases.price) + SUM(purchases.price * purchases.tax) AS total
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 2021-07-17
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多