首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在SQL中SUMmarize来自2个不同表的3列

在SQL中SUMmarize来自2个不同表的3列
EN

Stack Overflow用户
提问于 2017-12-18 06:35:07
回答 1查看 85关注 0票数 0

我有3个数据库表。我存储销售数据,比如发票编号、到期日、开具日期。第二个表我存储了前一个表中的销售记录id,在那里我存储了个人支付的金额(比如客户只支付了总价的一半)。在第三个表中,我存储了产品,并且每一行都有用于反向引用的销售记录id,在这个表中,我有数量和小计(数量*价格)。

我需要的是从第一个表中选择所有的记录,并根据sell_id我必须总结他们从第二个表中支付了多少钱,总结了一个人购买了多少产品和它花费了多少钱。我需要一些正确的解决方案的指导,因为我被卡住了。到目前为止,我得到了这个令人难以置信的解决方案:

代码语言:javascript
运行
复制
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查询来检索记录。

代码语言:javascript
运行
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-18 07:39:09

使用子查询聚合关联表,以确保仅将一行连接到一行……

代码语言:javascript
运行
复制
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表中不是惟一的,那么可以在外部查询中再次聚合。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47860139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档