Mysql按id对列组求和,然后将每个id的总和除以另一个表中另一列的值,并使用每行的匹配id

时间:2017-08-31 23:02:26

标签: mysql database loops

Mysql问题:我的公司出售谷物。我们购买大批量的谷物并以小包装出售。我们收到的每批散货都有自己的批号,其他数据也与该号码相关联。

我有一个库存表和一个产品变体表。

Sample of Warehouse_inventory_table

<table><tbody><tr><th>inventoryid</th><th>productid   </th><th>weight</th><th>batch</th><th>location</th><th>lot</th><th> </th><th> </th></tr><tr><td>1203</td><td>16134</td><td>0.000</td><td>1</td><td>LC Bucket</td><td>S1090</td><td> </td><td> </td></tr><tr><td>1882</td><td>16137</td><td>0.000</td><td>1</td><td>Small Cargo</td><td>S1025</td><td> </td><td> </td></tr><tr><td>603</td><td>16138</td><td>0.000</td><td>0</td><td>Archived</td><td>254-03-901</td><td> </td><td> </td></tr><tr><td>2695</td><td>16138</td><td>0.000</td><td>0</td><td>Archived</td><td>254-03-002-1</td><td> </td><td> </td></tr><tr><td>4086</td><td>16138</td><td>0.000</td><td>0</td><td>Archived</td><td>G-500-WD</td><td> </td><td> </td></tr><tr><td>4582</td><td>16138</td><td>150.000</td><td>2</td><td>Bulk Cargo</td><td>2373</td><td> </td><td> </td></tr><tr><td>4879</td><td>16138</td><td>30.885</td><td>1</td><td>LC Bucket</td><td>2373</td><td> </td><td> </td></tr><tr><td>3382</td><td>16139</td><td>1.516</td><td>1</td><td>On Shelf</td><td>S1520</td><td> </td><td> </td></tr><tr><td>256</td><td>16141</td><td>0.000</td><td>0</td><td>Archived</td><td>F6411</td><td> </td><td> </td></tr><tr><td>1963</td><td>16141</td><td>0.000</td><td>0</td><td>Archived</td><td>P6611</td><td> </td><td> </td></tr><tr><td>2090</td><td>16141</td><td>0.000</td><td>0</td><td>Archived</td><td>P6389</td><td> </td><td> </td></tr><tr><td>3470</td><td>16141</td><td>12.588</td><td>1</td><td>LC Bucket</td><td>N3915</td><td> </td><td> </td></tr><tr><td>4526</td><td>16141</td><td>27.000</td><td>2</td><td>Bulk Cargo</td><td>N3915</td><td> </td><td> </td></tr><tr><td>233</td><td>16142</td><td>6.991</td><td>1</td><td>LC Bucket</td><td>20701</td><td> </td><td> </td></tr><tr><td>281</td><td>16142</td><td>0.000</td><td>0</td><td>Archived</td><td>23055</td><td> </td><td> </td></tr><tr><td>1065</td><td>16142</td><td>50.000</td><td>4</td><td>Bulk Cargo</td><td>20123</td><td> </td><td> </td></tr><tr><td>2479</td><td>16142</td><td>30.821</td><td>3</td><td>Bulk Cargo</td><td>P6005</td><td> </td><td> </td></tr><tr><td>2097</td><td>16143</td><td>0.000</td><td>1</td><td>LC Bucket</td><td>34294</td><td> </td><td> </td></tr><tr><td>665</td><td>16144</td><td>0.000</td><td>0</td><td>Archived</td><td>W3178</td><td> </td><td> </td></tr><tr><td>1752</td><td>16144</td><td>0.000</td><td>0</td><td>Archived</td><td>12646</td><td> </td><td> </td></tr><tr><td>3629</td><td>16144</td><td>0.000</td><td>0</td><td>LC Bucket</td><td>M3386-1</td><td> </td><td> </td></tr><tr><td>4564</td><td>16144</td><td>28.000</td><td>2</td><td>Bulk Cargo</td><td>M3386-1</td><td> </td><td> </td></tr><tr><td>4830</td><td>16144</td><td>13.971</td><td>1</td><td>LC Bucket</td><td>M3386-1</td><td> </td><td> </td></tr><tr><td>243</td><td>16146</td><td>26.750</td><td>2</td><td>Bulk Cargo</td><td>D3302</td><td> </td><td> </td></tr><tr><td>656</td><td>16146</td><td>1.444</td><td>1</td><td>LC Bucket</td><td>D3302</td><td> </td><td> </td></tr><tr><td>3637</td><td>16146</td><td>50.000</td><td>3</td><td>Bulk Cargo</td><td>34636</td><td> </td><td> </td></tr><tr><td>1531</td><td>16149</td><td>0.000</td><td>0</td><td>Archived</td><td>S1086</td><td> </td><td> </td></tr><tr><td>2735</td><td>16149</td><td>46.000</td><td>3</td><td>Bulk Cargo</td><td>18/64</td><td> </td><td> </td></tr><tr><td>3128</td><td>16149</td><td>0.000</td><td>1</td><td>SC Bucket</td><td>S1528</td><td> </td><td> </td></tr><tr><td>3129</td><td>16149</td><td>1.238</td><td>2</td><td>SC Bucket</td><td>S1555</td><td> </td><td> </td></tr></tbody></table>

Sample of Variants_Table

<table><tbody><tr><th>variantid</th><th>productid</th><th>avail</th><th>weight</th><th>package_weight</th></tr><tr><td>404</td><td>16142</td><td>224</td><td>0.013</td><td>0.009</td></tr><tr><td>405</td><td>16142</td><td>8</td><td>0.280</td><td>0.270</td></tr><tr><td>409</td><td>16142</td><td>10</td><td>1.100</td><td>1.100</td></tr><tr><td>450</td><td>16141</td><td>225</td><td>0.006</td><td>0.002</td></tr><tr><td>509</td><td>16144</td><td>126</td><td>0.011</td><td>0.007</td></tr><tr><td>511</td><td>16144</td><td>10</td><td>0.074</td><td>0.070</td></tr><tr><td>512</td><td>16144</td><td>10</td><td>0.280</td><td>0.270</td></tr><tr><td>620</td><td>16138</td><td>110</td><td>0.039</td><td>0.035</td></tr><tr><td>622</td><td>16138</td><td>16</td><td>0.280</td><td>0.270</td></tr><tr><td>623</td><td>16138</td><td>12</td><td>1.100</td><td>1.100</td></tr><tr><td>917</td><td>16142</td><td>2</td><td>5.300</td><td>5.200</td></tr><tr><td>979</td><td>16146</td><td>10</td><td>1.100</td><td>1.100</td></tr><tr><td>1157</td><td>16144</td><td>11</td><td>1.100</td><td>1.100</td></tr><tr><td>1158</td><td>16144</td><td>5</td><td>5.300</td><td>5.200</td></tr><tr><td>3644</td><td>16138</td><td>6</td><td>5.300</td><td>5.200</td></tr><tr><td>3645</td><td>16138</td><td>2</td><td>26.000</td><td>25.500</td></tr><tr><td>3646</td><td>16138</td><td>1</td><td>52.000</td><td>51.000</td></tr><tr><td>3917</td><td>16141</td><td>11</td><td>0.074</td><td>0.070</td></tr><tr><td>3918</td><td>16141</td><td>8</td><td>0.280</td><td>0.270</td></tr><tr><td>3919</td><td>16141</td><td>13</td><td>1.100</td><td>1.100</td></tr><tr><td>3920</td><td>16141</td><td>2</td><td>5.300</td><td>5.200</td></tr><tr><td>3997</td><td>16143</td><td>6</td><td>0.011</td><td>0.007</td></tr><tr><td>4000</td><td>16143</td><td>0</td><td>0.074</td><td>0.070</td></tr><tr><td>4001</td><td>16143</td><td>0</td><td>0.280</td><td>0.270</td></tr><tr><td>4002</td><td>16143</td><td>0</td><td>1.100</td><td>1.100</td></tr></tbody></table>

我需要使用的列是库存表中的权重,以及变量表中的package_weight和avail列。

我要更新每个variantid的avail列,以显示每个大小的可用数据包数,基于清单表中相同产品ID的不同批次的总重量。

每个产品尺寸在变量表中都有自己的variantid,它与库存表中的productid相关联。(变量表中有一个名为productid的列)。每个variantid都有自己的package_weight列,其数据包大小权重为lbs。

我试图用SQL代码解决的问题是

我们需要找出每个种子产品ID我们以磅为单位的种子总数,并显示目前每种不同大小的变体可用的包数,并将其放入每个不同大小变体的avail列中每个产品。

我编写了一个简单的SQL查询,以从库存表中具有匹配产量的不同批号获取总权重。这很好,但是我在下一步就输了。

SELECT productid, SUM(weight) 
FROM warehouse_inventory 
GROUP BY productid;

<table><tbody><tr><th>productid</th><th>SUM(weight)</th><th> </th></tr><tr><td>16134</td><td>0.000</td><td> </td></tr><tr><td>16137</td><td>0.000</td><td> </td></tr><tr><td>16138</td><td>180.885</td><td> </td></tr><tr><td>16139</td><td>1.516</td><td> </td></tr><tr><td>16141</td><td>39.588</td><td> </td></tr><tr><td>16142</td><td>87.812</td><td> </td></tr><tr><td>16143</td><td>0.000</td><td> </td></tr><tr><td>16144</td><td>41.971</td><td> </td></tr><tr><td>16146</td><td>78.194</td><td> </td></tr><tr><td>16149</td><td>47.238</td><td> </td></tr></tbody></table>

现在我需要获取结果,该结果包含每个产品的总数,并将每个产品总数除以较小的数据包权重,以显示每个不同大小的variantid的package_weight与匹配的productid可用的大小数据包的数量。

例如:

现在我们可以获得多少1盎司冬季黑麦包,我们采用我们的总重量,2000磅冬季黑麦谷物,并将其除以package_weight .07磅(1盎司),这表明我们有28571包可用。

如何将可用金额放入变体表的avail列?

我是SQL新手,但我正在尝试这样的事情:

INSERT INTO variants(avail) 
VALUES(@updated_variant_amount_avail)

SET @product_total_weight := (SELECT i.productid, SUM(weight) 
                              FROM warehouse_inventory AS i
                              GROUP BY i.productid;)

INNER JOIN variants AS v ON v.productid = i.productid

SET @updated_variant_amount_avail := SUM(@product_total_weight /v.package_weight) 

不确定这是否可以只用sql。我正在研究存储过程,并想知道我是否应该考虑尝试这种方式。或者有更好的解决方案吗?我应该只用mysql尝试这样做吗?

此外,这需要每天运行一次或两次,所以我要做一个mysql事件。有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

这可能有用

select productid as 'Product',
       sum(weight) as 'Total weight',
       (sum(weight) / InF2.package_weight)  as 'Packets'
  From TABLE_containing_totalweights as InF1
  Left Join TABLE_containing_packetweights as InF2
    On InF1.productID = InF2.productID