sql视图使用组合并根据订单中的项目数分割运费

时间:2015-12-28 09:23:22

标签: mysql sql group-by sum

需要创建一个sql视图来计算佣金&运输费用。运费按订单ID级别收取,我需要在订单商品ID级别计算成本。请查看附件中的图片。请注意,运费是订单ID级别。而不是订单商品ID级别。对于运费行,订单商品ID列为空白。

SQL VIEW IMAGE

为小提琴创建表格代码

    CREATE TABLE IF NOT EXISTS `test`.`T` (`order_id` varchar(19),
    `order_item_id` varchar(14), `type` varchar(17), `description`
    varchar(16), `amount` int(3)) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
    INSERT INTO `test`.`T` (`order_id`, `order_item_id`, `type`,
   `description`, `amount`) VALUES ('171-7045714-5715521', '51516304093723', 'ItemPrice', 'Principal', 200),
    ('171-7045714-5715521', '51516304093723', 'ItemFees', 'Commission', -16),
    ('171-7045714-5715521', '17035541556323', 'ItemPrice', 'Principal', 450),
    ('171-7045714-5715521', '17035541556323', 'ItemFees', 'Commission', -36),
    ('171-7045714-5715521', '', 'other-transaction', 'Shipping Charges', -55);

2 个答案:

答案 0 :(得分:0)

尝试此查询

SELECT T.order_id,
    T.order_item_id,
    total
        + COALESCE((SELECT SUM(amount) FROM Orders_Detail AS OD
                  WHERE OD.order_id = T.order_id
                            AND type = 'other_transaction'), 0)
          / 
          COALESCE((SELECT COUNT(*) FROM Orders_Detail AS OD
                  WHERE OD.order_id = T.order_id
                            AND type = 'ItemPrice'), 1) 
FROM
    (SELECT OD.order_id,
           OD.order_item_id,
           SUM(amount) total
    FROM Orders_Detail AS OD
    WHERE OD.order_item_id IS NOT NULL
    GROUP BY OD.order_id, 
             OD.order_item_id) AS T

答案 1 :(得分:0)

SQL语法可能会被供应商更改,但以下内容应该适用于其他版本的MS SQL SERVER次要变体,主要使用COALSCE的不同函数:

CREATE VIEW myView as 
   SELECT main.order_id, main.order_item_id, COALESCE(P.a,0) + COALESCE(C.a,0) - (COALESCE(S.a,0) / main.c) AS price
   FROM 
         (((SELECT order_id, order_item_id, count(*) as c FROM orderTable GROUP BY order_id, order_item_id) main LEFT OUTER JOIN
         (SELECT amount AS a FROM orderTable WHERE description='Principal') P ON main.order_id =P.order_id AND main.order_item_id = P.order_item_id)  LEFT OUTER JOIN
         (SELECT amount AS a FROM orderTable WHERE description='Commission') C ON main.order_id=C.order_id AND main.order_item_id = C.order_item_id)  LEFT OUTER JOIN (SELECT amount AS a FROM orderTable WHERE description='Shipping Charges') S ON main.order_id=S.order_id AND main.order_item_id = S.order_item_id