MYSQL - 检测共有三列的行

时间:2012-10-25 12:05:13

标签: mysql rows detect matching divide

我正在开发一个小脚本,它将订单信息从较新的数据库(用于在线订单)转移到一个过时的自定义数据库,它们有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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

这将显示您有多个行的所有行,其中Channel,Order和Code相同。然后,您可以Totalcount(*)计算单行价格。

答案 3 :(得分: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子句中添加你想要的任何列。