2012-02-13 11 views
0

私は1つのテーブルを持っています(1つしかありません)。自己参加の問題だと思いますか?

植物コード、記事番号、およびその記事に関連するバッチが含まれています。

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数とボリュームを表示(plant A1にそのコード1000注意はわずか10とを示しています最近追加されたバッチの量です)。

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

私はここに、以前の男からいくつかの助けを得て、同じ植物の同じ製品の同じ番号を持つ2つのバッチがある場合、私は、最新のバッチからボリュームを取得しようとするまで、そのクエリが素晴らしい作品。

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 

私はあなたには、いくつかの連結自己加入でそれを行うことができると思いますが、私は一つのテーブルのみで動作するために十分習熟していない午前:事前に/

ありがとう!

編集:実は、アドリアンがリンクしている答えは、説明されている問題を解決しました...しかし、他のすべてをその解決策で動作させることは難しいようです。私は自分自身の「問題」の一部しか説明していませんでした。残りの部分を自分で解決するには十分だと思いました。しかし、私は間違っていました。最新の追加されたバッチとボリュームが必要なだけでなく、バ​​ッチに対していくつかのSUM操作を行う必要があります。私はそれが2つの異なるテーブルにデータを配置し、そこから作業することが最善であると考えています。ここで

+1

あなたはあなたの手で持っている[タグ:最大-N-あたり-グループ]の問題を。私はあなたのためのテーラーメードの答えを書く時間が足りないので、ここで読むために時間をかけてください:http://stackoverflow.com/a/7745635/570191。それは正しい答えにあなたを導くでしょう –

+0

ありがとうエイドリアン、私はそれを読むでしょう!最初に私はあなたの問題のための解決策がなかったと言うことに恐れていました:) – Josef

+0

あなたの問題を解決するためにもっと多くの方法があります:)答えがあなたに役立つならupvoteを忘れないでください –

答えて

0

MAX(added_date)て音量を取得JOINサブクエリを使用した可能性があります:

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

それはうまくいきませんでした。これは、同じバッチの2つの製品を持つプラントを無視しました。この場合、プラントA1はまったく表示されませんでした。/ – Josef

+0

@Josef「ON」句の変更を参照してください。 'AND l.volume = lvol.volume'を追加しました –

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

+0

@Josef:答えを更新しました。 – Akhil

+0

それはよかったです。 TotalRiskの後に "、"を削除するだけです。しかし、たとえそれが私の例に含まれていたとしても、私はその価値に対して同じことをする必要があります。私は基本を持っていたときに自分自身を理解することができたと思った。しかし、このクエリではそれほど単純ではありませんでした。 – Josef