2

我正在编写一个小脚本,它将订单信息从较新的数据库(用于在线订单)传输到一个过时的自定义数据库,其中包含 20 多年的信息,并且它只接受制表符分隔的输入(非常痛苦)和无法处理多商品 SKU(即每个 SKU 都是一件商品)。

我创建了一个表(未显示),将多项目 SKU 与过时系统的单个 SKU 相关联 - 您可以在下面的第 2 行到第 4 行中看到最初的三个项目(在线称为“pcclean”)一个订单行分成三行(CL31、CL15 和 CL13 - 旧系统的 SKU)。

但是,在生成此表时,我无法将价格分成三份。价格变化太频繁,无法依赖储值。

我想要做的是检测 Channel、Order 和 Code 何时相同,并将这些行中的“Total”除以符合该条件的行数。

所以第 2-4 行不会显示“12.45”,它们会分别显示“4.15”。

Channel                 Order   QTY  SKU    Total    Code
Amazon Seller Central   1518    1    PX5    7.29     PX5
Amazon Seller Central   1519    1    CL31   12.45    pcclean
Amazon Seller Central   1519    1    CL15   12.45    pcclean
Amazon Seller Central   1519    1    CL13   12.45    pcclean
Amazon Seller Central   1520    1    MS516  25       MS516
Amazon Seller Central   1521    1    PX10   4.49     PX10
Amazon Seller Central   1522    1    CL31   12.45    pcclean
Amazon Seller Central   1522    1    CL15   12.45    pcclean
Amazon Seller Central   1522    1    CL13   12.45    pcclean
Amazon Seller Central   1523    1    PX40   12.94    PX40
Amazon Seller Central   1524    1    PX12   12.49    PX12
Amazon Seller Central   1525    1    AD254  14.05    AD36
Amazon Seller Central   1526    1    MS516  25       MS516
Amazon Seller Central   1527    1    CL31   12.45    pcclean
Amazon Seller Central   1527    1    CL15   12.45    pcclean
Amazon Seller Central   1527    1    CL13   12.45    pcclean
Amazon Seller Central   1528    1    PX13   27.54    px13
Amazon Seller Central   1529    1    PX28   18.02    PX28
Amazon Seller Central   1530    1    PX28   18.02    PX28
Amazon Seller Central   1531    1    PX40   12.94    PX40
Amazon Seller Central   1532    1    PX33   29.98    px33
Amazon Seller Central   1533    1    PX47   12.44    PX47
Amazon Seller Central   1534    6    PX1    64.44    1PX1
Amazon Seller Central   1534    1    PX40   18.43    px40px35
Amazon Seller Central   1534    1    PX35   18.43    px40px35
eBay                    104     1    MS516  16       150282363749

有任何想法吗?

4

4 回答 4

2
SELECT *,total/cnt.val FROM `mytable` 
LEFT JOIN (SELECT `Channel`,`Order`,`Code`,COUNT(*) AS val 
           FROM `mytable` GROUP BY `Channel`,`Order`,`Code`) AS cnt 
USING (`Channel`,`Order`,`Code`);

这里的例子:http ://www.sqlfiddle.com/#!2/cdd16/28

于 2012-10-25T12:42:09.423 回答
1

您可以通过将表连接回自身来在单个查询中执行此操作:

SELECT  O.Channel,
        O.Order,
        O.Qty,
        O.SKU,
        O.Code,
        O.Total,
        ROUND(O.Total/GroupedOrders.OrderCount, 3) AS OriginalPrice

FROM    Orders AS O
INNER JOIN
            (SELECT Channel, `Order`, Code, COUNT(`Order`) AS OrderCount FROM Orders GROUP BY Channel, `Order`, Code) AS GroupedOrders 
                ON O.Channel = GroupedOrders.Channel AND O.Order = GroupedOrders.Order AND O.Code = GroupedOrders.Code

这会将表格连接到其自身的分组版本中,并将总数除以分组的行数。

这是实际的查询:http ://www.sqlfiddle.com/#!2/30b35/3

于 2012-10-25T12:23:37.653 回答
0

您可以使用基于您指定的三列返回相同行数的子查询:

SELECT
  orders.Channel,
  orders.Order,
  orders.Code,
  orders.Total/
    (SELECT count(*)
     FROM
       orders orders_1
     WHERE
       orders_1.Channel = orders.Channel
       AND orders_1.Order = orders.Order
       AND orders_1.Code = orders.Code
     GROUP BY
       orders_1.Channel, orders_1.Order, orders_1.Code) As Total
FROM
  orders

当然,您可以在 select 子句中添加您想要的任何列。

于 2012-10-25T12:35:17.527 回答
0

首先检测具有相同列的行:

select Channel, Order, Code, Total, count(*) from mytable
group by Channel, Order, Code
having count(*) > 1

这将显示您拥有多行且通道、订单和代码相同的所有行。Total然后您可以count(*)计算单行的价格。

于 2012-10-25T12:14:47.570 回答