汇总SQL中2个不同表中的3列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇总SQL中2个不同表中的3列相关的知识,希望对你有一定的参考价值。
我有3个数据库表。我存储的那个销售数据,如发票号,到期日,发行日期。第二个表我有从前一个表中存储的销售记录ID,在那里我存储了该人支付的金额(类似于客户仅支付总价格的一半)。在第三个表中,我存储了产品,每行都有反向引用的销售记录ID,在此表中我有数量和小计(数量*价格)。
我需要的是从第一张表中选择所有记录,并根据sell_id我必须总结他们从第二张表中支付了多少钱,总结了购买了多少产品以及它需要多少费用。我需要一些正确解决方案的指导,因为我被卡住了。到目前为止,我来到这个uggly sollution:
SELECT
(SELECT SUM(payment.sellpayment_amount) FROM es_sellpayment payment WHERE sell.sell_id = payment.sell_id) AS payed,
(SELECT SUM(product.sellproduct_quantity) FROM es_sellproduct product WHERE sell.sell_id = product.sell_id) AS quantity,
(SELECT SUM(product.sellproduct_total) FROM es_sellproduct product WHERE sell.sell_id = product.sell_id) AS total
FROM es_sell sell
它的工作原理我得到了正确的结果,但我不确定/不知道这将如何影响网站的性能。我尝试了经典的左连接,这给了我错误的结果。我也在考虑将这3个值永久存储在主表上;但这将是最好的方法,因为我必须至少进行2次单独的SQL查询来检索记录。
CREATE TABLE `es_sell` (
`sell_id` int(11) NOT NULL,
`sell_invoice` int(11) NOT NULL,
`sell_note` text COLLATE utf8mb4_unicode_ci NOT NULL,
`sell_deliver` datetime NOT NULL,
`sell_issued` datetime NOT NULL,
`sell_due` datetime NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `es_sellproduct` (
`sellproduct_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
`sellproduct_quantity` int(11) NOT NULL,
`sellproduct_price` int(11) NOT NULL,
`pricetype_id` int(11) NOT NULL,
`sellproduct_total` decimal(11,3) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `es_sellpayment` (
`sellpayment_id` int(11) NOT NULL,
`sellpayment_amount` decimal(11,3) NOT NULL,
`sell_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
答案
使用子查询来聚合关联的表,以确保您只将一行连接到一行...
SELECT
sell.sell_id,
payment.payed,
product.quantity,
product.total
FROM
es_sell sell
LEFT JOIN
(
SELECT
sell_id,
SUM(sellpayment_amount) AS payed
FROM
es_sellpayment payment
GROUP BY
sell_id
)
payment
ON payment.sell_id = sell.sell_id
LEFT JOIN
(
SELECT
sell_id,
SUM(sellproduct_quantity) AS quantity,
SUM(sellproduct_total ) AS total
FROM
es_sellproduct
GROUP BY
sell_id
)
product
ON product.sell_id = sell.sell_id
如果sell_id
在sell
表中不是唯一的,则可以在外部查询中再次聚合。
以上是关于汇总SQL中2个不同表中的3列的主要内容,如果未能解决你的问题,请参考以下文章
从 2 个不同片段的 sqlite 中的 2 个表中获取信息