在联接查询中选择DISTINCT行的SUM

时间:2017-05-01 12:51:16

标签: mysql

我有两张桌子,订单和订单。我按日期报告销售情况,需要包括每个日期的每个订单项目的总成本价格和销售价格以及每个订单在每个日期的总交付成本:

表:订单

orderid    date          deliverycost
1          2000-01-01    5
2          2000-01-01    3
3          2000-01-02    0
4          2000-01-02    4

表:orderitem

orderitemdid    orderid    costprice    sellingprice
1               1          10           12
2               1          2            4
3               2          10           12
4               3          5            6
5               3          4            10
6               4          1            2

我正在寻找一个提供以下输出的查询:

date          costprice   sellingprice   deliverycost
2000-01-01    22          28             8    
2000-01-02    10          18             4

我尝试过以下SQL:

        SELECT
            SUM(`orderitem`.`costprice`) AS `costprice`,
            SUM(`orderitem`.`sellingprice`) AS `sellingprice`,
            SUM(`order`.`delivery`) AS `delivery`,
            DATE(`order`.`date`) AS `date`,
        FROM
            `order`
        INNER JOIN
            `orderitem`
        ON
            (`order`.`orderid` = `orderitem`.`orderid`)
        GROUP BY
            `date`
        ORDER BY
            `date`

问题在于我最终将交货价格乘以订单商品的数量,因此我希望在orderdelivery之前执行SUM()。加入发生。

1 个答案:

答案 0 :(得分:1)

可能与报价的不当使用有关 不要对列名使用单引号,但在需要时使用backtics

   SELECT
        SUM(`orderitem`.`costprice`) as costprice,
        SUM(`orderitem`.`sellingprice`) as sellingprice,
        SUM(`order`.`delivery`) as delivery,
        DATE(`order`.`confirmdate`) as `date`,
    FROM  `order`
    INNER JOIN  `orderitem`    ON `order`.`orderid` = `orderitem`.`orderid`
    GROUP BY  `date`
    ORDER BY `date`
在您的情况下,

也应该避免背景,因为您没有分隔的列名和保留字

   SELECT
        SUM(orderitem.costprice) as costprice,
        SUM(orderitem.sellingprice) as sellingprice,
        SUM(order.delivery) as delivery,
        DATE(order.confirmdate) as date,
    FROM  order
    INNER JOIN  orderitem    ON order.orderid = orderitem.orderid
    GROUP BY  date
    ORDER BY date

并且为了避免使用笛卡尔积,您可以加入聚合表

   SELECT
        SUM(t.costprice) as costprice,
        SUM(t.sellingprice) as sellingprice,
        SUM(order.delivery) as delivery,
        DATE(order.confirmdate) as date,
    FROM  order
    INNER JOIN  (
    SELECT 
        orderitem.orderid
        SUM(orderitem.costprice) as costprice,
        SUM(orderitem.sellingprice) as sellingprice
        from orderitem
        group by  orderitem.orderid
      ) t ON order.orderid = t.orderid
    GROUP BY  date
    ORDER BY date
相关问题