2

私は、注文情報を新しいデータベース(オンライン注文用)から20年以上の情報があり、タブ区切りの入力のみを受け入れる時代遅れのカスタムデータベースに転送する小さなスクリプトに取り組んでいます(かなり苦痛です)。複数アイテムのSKUを処理できません(つまり、各SKUは1つのアイテムです)。

複数アイテムのSKUを旧式のシステムの単一のSKUに関連付けるテーブル(図には示されていません)を作成しました。以下の2行目から4行目で、元々は1つに3つのアイテム(「pcclean」オンラインと呼ばれます)があることがわかります。 1つの注文明細が3つの行に分割されます(CL31、CL15、およびCL13-古いシステムのSKU)。

ただし、このテーブルを生成するときに価格を3つに分割するのに問題があります。価格は頻繁に変更されるため、保存されている値に依存することはできません。

私がやりたいのは、チャネル、順序、およびコードが同じであるかどうかを検出し、それらの行の「合計」をその基準に一致する行の数で割ることです。

したがって、行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 Channel, Order, Code, Total, count(*) from mytable
group by Channel, Order, Code
having count(*) > 1

これにより、チャネル、注文、コードが同一の複数の行があるすべての行が表示されます。次に、単一行の価格を取得Totalして計算できます。count(*)

于 2012-10-25T12:14:47.570 に答える
0

指定した3つの列に基づいて、同一の行の数を返すサブクエリを使用できます。

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 に答える