【问题标题】:How to sum columns when table is joined?连接表时如何对列求和?
【发布时间】:2022-11-12 09:20:24
【问题描述】:

尝试从连接到另一个表的表中求和(导致第一个表的每行多行),它正在计算每个第二个表中的行数。

表:

create table t_orders (
    oid int,
    cartlink nvarchar(3),
    ordertotal float,
    ordertax float
);
create table t_cart (
    cartlink nvarchar(3),
    productid int
);

insert into t_orders (oid,cartlink,ordertotal,ordertax) values
    (1,'abc',10, 2),
    (2,'cdf',9, 1),
    (3,'zxc',11, 3)
;
insert into t_cart (cartlink,productid) values
    ('abc', 123),('abc', 321),('abc', 987),
    ('cdf', 123),('cdf', 321),('cdf', 987),
    ('zxc', 123),('zxc', 321),('zxc', 987)
;

t_orders 表使用以下值对问题更准确。使用distinct 只计算订单 2 和 3 一次,因为它们的总数都是 9。

values (1,'abc',10, 2),(2,'cdf',9, 1),(3,'zxc',9, 3);

查询及结果:

SELECT
    SUM(t_orders.ordertotal) AS SumOfTotal,
    SUM(t_orders.ordertax)   AS SumOfTax
FROM
    t_orders
JOIN t_cart ON t_orders.cartlink = t_cart.cartlink
;
SumOfTotal SumOfTax
90 18

我想要的是 :

SumOfTotal SumOfTax
30 6

加入t_orders -> t_cart -> t_products -> t_manufacturer,因为我想从t_orders WHERE t_manufacturer.type = 'some value' 中求和。

【问题讨论】:

    标签: sql sql-server join sum


    【解决方案1】:

    尝试这个

    SELECT SUM(DISTINCT t_orders.ordertotal) AS SumOfTotal
        , SUM(DISTINCT t_orders.ordertax) AS SumOfTax 
    FROM t_orders
    JOIN t_cart ON t_orders.cartlink = t_cart.cartlink
    

    【讨论】:

    • 这适用于我的小测试,但在真正的数据库中,总和约为应有的 20%。 'distinct' 是否会查找所有 'ordertotal' 值并且只对唯一值求和?换句话说,如果两个订单的总数为 9.99,它只计算其中一个?
    • @doug,当然,如果您通过 t_orders.cartlink 添加组
    • 使用 group by 为每一行提供一行,而不仅仅是 2 个总和。
    【解决方案2】:

    “……我试图从t_orders WHERE t_manufacturer.type = 'some value' 总结。"

    使用子查询:

    SELECT
        SUM(t1.Total) AS SumOfTotal,
        SUM(t1.Tax)   AS SumOfTax
    FROM
        (
            SELECT
                MAX(t_orders.ordertotal) AS Total,
                MAX(t_orders.ordertax)   AS Tax
            FROM t_orders
            JOIN t_cart         ON t_orders.cartlink         = t_cart.cartlink
            JOIN t_products     ON t_cart.productid          = t_products.pid
            JOIN t_manufacturer ON t_products.manufacturerid = t_manufacturer.mid
            WHERE t_manufacturer.type = 'some value'
            GROUP BY t_orders.oid
        ) AS t1
    

    或者:

    SELECT
        SUM(t1.Total) AS SumOfTotal,
        SUM(t1.Tax)   AS SumOfTax
    FROM
        (
            SELECT
                MAX(t_orders.ordertotal) AS Total,
                MAX(t_orders.ordertax)   AS Tax
            FROM t_orders
            JOIN t_cart         ON t_orders.cartlink = t_cart.cartlink
            JOIN t_products     ON t_cart.productid  = t_products.pid
            WHERE t_products.manufacturerid IN (
                SELECT mid FROM t_manufacturer WHERE type = 'some value'
            ) AS t2
            GROUP BY t_orders.oid
        ) AS t1
    

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 2021-10-09
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 2015-08-24
      相关资源
      最近更新 更多