汇总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_idsell表中不是唯一的,则可以在外部查询中再次聚合。

以上是关于汇总SQL中2个不同表中的3列的主要内容,如果未能解决你的问题,请参考以下文章

从 2 个不同片段的 sqlite 中的 2 个表中获取信息

在一个表中的不同行和不同列中查找相同的值SQL

使用 pl/sql 或 sql 将数据拆分到学生表中的多个列

SQL语句

如何在SQL中显示3个不同表中的多列?

PL/SQL 使用一张表中的列数据更新表,基于不同表之间的相等性