2012-02-13 29 views
0

我有一个表(只能有一个),看起来像下面看到的。自我加入问题,我想?

它包含工厂代码,物品编号和与该物品相关的批次。

plant - code - batch - value - volume - added_date 
A1  1000 A1  10  20  date 
A1  2000 A7  20  15  date 
A1  1000 A1  5  10  later than first A1 batch 
A2  200 A8  10  9  date 
A1  2000 A10  20  20  date 

我怎么会出现这样的信息:每个工厂和代码,显示DISTINCT批数和仅新增加了一批体积(注意代码1000 plant A1只显示10作为是最新添加的批量)。

plant - code - batches - volume 
    A1  1000 1   10  
    A1  2000 2   35 
    A2  200 1   9 

我从这里早的人一些帮助,而且查询的伟大工程,直到我试图摆脱只有最新的批卷,如果有两个批次与在同一植物的相同产品相同数量。

SELECT code, plant, 
    COUNT(DISTINCT(batch)) as Batches, 
    SUM(value) as TotalValue, 
    SUM(volume) as TotalVolume, 
    SUM(value * risk) as TotalRisk, 
FROM lists 
GROUP BY code, plant 

我想你可以用一些CONCAT和自我做其加入,但我没有足够的技术,只有一个表的工作:/

提前感谢!

编辑:恩,实际上阿德里安联系的答案解决了所描述的问题......但似乎很难做到让所有其他解决方案都能正常工作。我只描述了我的“问题”的一部分,我认为足以让我自己解决其他问题。但是我错了。我不仅需要最新添加的批次和体积,还需要对批次执行一些SUM操作。我认为将数据放在两个不同的表格中并从那里工作可能是最好的选择。

+1

你有你的手[标签:最大正每组]问题。我没有时间为您编写一份量身定做的答案,请花些时间阅读这里:http://stackoverflow.com/a/7745635/570191。它会引导你到正确的答案 – 2012-02-13 19:30:23

+0

谢谢阿德里安,我会读到的!首先,我担心你会说我的问题没有解决方案:) – Josef 2012-02-13 19:45:38

+0

别担心,还有更多的方法来解决你的问题:)不要忘记upvote如果答案在那里帮助你 – 2012-02-13 19:53:11

回答

0

下面是一个使用子查询JOIN其检索由MAX(added_date)体积的可能性:

SELECT 
    l.code, 
    l.plant, 
    COUNT(DISTINCT l.batch) AS Batches, 
    lvol.vol AS volume 
FROM 
    lists l JOIN (
    SELECT code, plant, volume AS vol FROM lists GROUP BY code, plant HAVING added_date = MAX(added_date) 
) lvol ON l.code = lvol.code AND l.plant = lvol.plant AND l.volume = lvol.volume 
GROUP BY l.code, l.plant 
+0

这没有奏效。它忽略了我们拥有两个相同批次的产品的工厂,在这种情况下工厂A1根本没有显示出来:/ – Josef 2012-02-13 19:44:00

+0

@Josef查看对连接“ON”子句的更改。增加了'AND l.volume = lvol.volume' – 2012-02-13 19:54:04

0
SELECT t.*, 
     (SELECT volume 
      FROM lists 
      WHERE plant = t.plant 
      AND code = t.code 
      ORDER BY added_date DESC 
      LIMIT 1 --Take the latest record for the plant & code 
     ) AS volume     
    FROM (
      SELECT code, plant, 
       COUNT(DISTINCT(batch)) as Batches, 
       SUM(value) as TotalValue, 
       SUM(value * risk) as TotalRisk 
      FROM lists 
      GROUP BY code, plant 
     ) AS t 
+0

给我一个我无法解决的错误“FROM lists”。 – Josef 2012-02-13 19:48:07

+0

@Josef:更新了答案。 – Akhil 2012-02-13 19:58:43

+0

这比较好。在TotalRisk之后删除“,”。但是,即使包含在我的示例中,我也需要为值做同样的事情。当我有了一些基本知识后,我认为自己能够弄清楚自己。但是用这个查询并不那么简单。 – Josef 2012-02-13 20:18:41