【问题标题】:MySQL select rows where its columns sum equal valueMySQL选择其列总和相等的行
【发布时间】:2015-10-17 09:32:29
【问题描述】:

我有以下表格:

答:

+----+-----------+-------+----------+
| ID | PaymentID | Price | Quantity |
+----+-----------+-------+----------+
|  1 |         1 |   128 |        1 |
|  2 |         2 |    10 |        2 |
|  3 |         2 |    11 |        1 |
|  4 |         3 |   100 |        2 |
+----+-----------+-------+----------+

乙:

+-----------+------------+
| PaymentID | TotalPrice |
+-----------+------------+
|         1 |        128 |
|         2 |         31 |
|         3 |        201 |
+-----------+------------+

并查询:

SELECT a.ID
FROM a
LEFT JOIN b ON b.PaymentID = a.PaymentID
WHERE b.TotalPrice = (a.Price * a.Quantity)

当 a.PaymentID 是唯一的,但表 A 中的一些交易被分开并一起支付(表 B)时,它可以正常工作。上面的查询返回 a.ID = 1 但我需要返回 a.ID = 1,2,3。

a.PaymentID(1): 128 * 1 = 128 MATCH
a.PaymentID(2): 10 * 2 + 11 * 1 = 31 MATCH
a.PaymentID(3): 100 * 2 = 200 NOT MATCH

SQL Fiddle

【问题讨论】:

  • 为什么你need to return a.ID = 1,2,3. 你的预期输出是什么?
  • 为什么你期望 ID =3?这里的总价格不等于价格 * 数量?
  • 为什么需要表B?你需要保持它是正确的。您可以通过简单的 SQL 检索它。 SELECT PaymentID, sum(Price*Quantity) FROM A WHERE PaymentID = 2 GROUP BY PaymentID
  • 表 A 中的交易从表 B 中分离出来 (PaymentID = 2) => 10*2 + 11*1 = 31。表 A 是交易列表,表 B 是从银行帐户生成的,我需要返回与收到的付款匹配的交易。
  • 顺便提一下,这将呈现为 INNER JOIN。

标签: mysql join sum


【解决方案1】:

试试这个说法:

SELECT a.ID, b.totalprice
FROM a
LEFT JOIN b ON b.PaymentID = a.PaymentID
group by b.paymentID
having TotalPrice = sum(a.Price * a.Quantity)

SQLFIDDLE

更新:澄清后:

select a.id from a where paymentId in(
  select paymentID from(
SELECT a.paymentID as paymentID, b.totalprice
FROM a
LEFT JOIN b ON b.PaymentID = a.PaymentID
group by b.paymentID
having TotalPrice = sum(a.Price * a.Quantity)) as c )

【讨论】:

  • 现在可以使用了。但是@Abhik 解决方案似乎更适合我的需求。无论如何,感谢您的耐心等待。
【解决方案2】:

您正在尝试将表 a 中的价格和金额的总和与 PaymentId 一起连接到表 b,并将其用于连接子句,该子句将基于每行而不是基于聚合来计算。 你可能需要先找到聚合部分,然后加入一些东西作为

select
a.ID
from a 
left join (
  select sum(Price*Quantity) as tot,PaymentID 
  from a group by PaymentID
)x on x.PaymentID = a.PaymentID
join b on b.PaymentID = a.PaymentID and x.tot = b.TotalPrice

http://www.sqlfiddle.com/#!9/3b261/45

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    相关资源
    最近更新 更多