【问题标题】:MYSQL Sum of Multiple Tables Using Primary KeyMYSQL 使用主键对多个表求和
【发布时间】:2012-09-19 17:54:01
【问题描述】:

MySQL 对我来说还是很新,所以我很难找到这个特定问题的答案。

我有大约 60 个供应商表,我想将它们合并到一个表中。我们的很多供应商都携带相同的物品,所以我想将所有物品添加到一张桌子上,而那些具有相同 sku 的供应商将数量加在一起。我还想插入更大的成本和价格,并将其四舍五入到 0.99,但如果它变得太复杂或无法实现,我现在将坚持只使用 sku 和数量。我想从 2 个表开始,直到我弄明白,然后一旦我掌握了解决方案,我就可以处理所有这些表。以下是 2 个表的示例:

Table A (SKU will be the primary key)
SKU     Vendor A SKU         Cost     Price      QTY
1000        VA100            49.99    62.99      10
1001        VA101            64.44    81.99      6
1002        VA102            37.67    47.99      24
1003        VA103            28.33    35.99      16
1004        VA104            26.33    35.99      18

Table B (SKU will be the primary key)

SKU     Vendor B SKU         Cost    Price       QTY
1000        VB100            49.99   62.95        21
1001        VB101            64.44   81.95        16
5001        VB501            32.67   40.95         4
5002        VB502            88.44   110.95      12
5003        VB503            87.21   109.95       2

所以最终结果会是这样的

SKU     Vendor A SKU     Vendor B SKU      Cost           Price         QTY
1000        VA100               VB100      49.99         62.99          31 <-- Sum
1001        VA101               VB101      64.44         81.99          22 <-- Sum
1002        VA102                          37.67         47.99          24
1003        VA103                          28.33         35.99          16
1004        VA104                          26.33         35.99          18
5001                            VB501      32.67         40.95           4
5002                            VB502      88.44         110.95         12
5003                            VB503      87.21         109.95          2

如您所见,前 2 个将数量相加,以及插入的成本和价格中的较大者。我尝试了以下变体:

Create Table MASTER
SELECT TableA.sku,TableA.VendorA_sku,TableA.cost,TableA.price,TableA.qty
UNION ALL
SELECT TableB.sku,TableB.VendorB_sku,TableB.cost,TableB.price,TableB.qty
GROUP BY sku

以及以下变化:

Create Table MASTER
AS SELECT TableA.sku,TableA.VendorA_sku,TableA.cost,TableA.price,SUM(TableA.qty+TableB.qty)
GROUP BY sku

我尝试了许多不同类型的联接和联合,但似乎无法让任何东西看起来符合我的需要,我也没有尽我所能解决成本和价格的增加和四舍五入的问题'不要在重复的主键中添加数量。我必须每天使用大约 60 张桌子和大约 600k sku 进行此操作,因此我们将不胜感激。

如果我没有正确输入此内容,我也提前道歉,因为我是这些类型的论坛的新手

【问题讨论】:

    标签: mysql sql sum average


    【解决方案1】:

    以下内容应该适合您:

    select sku,
      min(case when Type = 'VendorA' THEN Vendor END) VendorA_SKU,
      min(case when Type = 'VendorB' THEN Vendor END) VendorB_SKU,
      cost,  
      price, 
      sum(QTY) Total
    from
    (
      select sku, VendorA_SKU Vendor, cost, price, qty, 'VendorA' Type
      from tablea
      union all 
      select sku, VendorB_SKU, cost, price, qty, 'VendorB' Type
      from tableb
    ) x
    group by sku
    

    SQL Fiddle with Demo

    有几件事要决定,如果值不同,您想要AVG()MAX() 成本和价格,或者您想要返回哪一个?如果你这样做了,那么你将使用以下内容返回MAX()

    select sku,
      min(case when Type = 'VendorA' THEN Vendor END) VendorA_SKU,
      min(case when Type = 'VendorB' THEN Vendor END) VendorB_SKU,
      max(cost) MaxCost,
      max(price) MaxPrice,
      sum(QTY) Total
    from
    (
      select sku, VendorA_SKU Vendor, cost, price, qty, 'VendorA' Type
      from tablea
      union all 
      select sku, VendorB_SKU, cost, price, qty, 'VendorB' Type
      from tableb
    ) x
    group by sku
    

    SQL Fiddle with Demo

    【讨论】:

    • 这是我用来测试语句的内容,如果您可以为我仔细检查一下,因为它看起来有效,我想确定一下。我有点不确定你为 'VendorA'/'VendorB' 输入了什么,因为我在任何地方都没有,所以我即兴选择了 select sku, min(case when Type = 'eastern_sku' THEN sku END) eastern_sku, min(类型 = 'western_sku' THEN sku END) west_sku, cost, price, sum(QTY) Total from ( select sku, eastern_sku, cost, price, qty, 'eastern' Type from Eastern union all select sku, oneal_sku, cost, price, qty, 'western' Type from west ) x group by sku
    • @user1683692 很乐意为您提供帮助,希望这能将您推向正确的方向。
    • 还有一个问题。因此,对于我需要添加的每个附加表,我将包含另一个语句 min(case when Type = 'western_sku' THEN sku END) west_sku,并选择 sku、western_sku、cost、price、qty、'western' Type from Western for每个额外的表格都正确吗?
    • @user1683692 是的,如果您要添加更多表,那么您将使用UNION ALL 添加它,然后添加CASE 以获取新列中的值。至于VendorA/VendorB,您可以随意称呼它,我只是将它用于我的示例。您需要它来识别每条记录。
    • @user1683692 然后在CASE 语句中使用VendorA/VendorB 标识符。
    猜你喜欢
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    相关资源
    最近更新 更多