我正在开发一个小脚本,它将订单信息从较新的数据库(用于在线订单)转移到一个过时的自定义数据库,它们有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
有什么想法吗?
答案 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`);
答案 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相同。然后,您可以Total
和count(*)
计算单行价格。
答案 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子句中添加你想要的任何列。