2012-04-06 4 views
0

私は、会社、仕事、日付別の「最初のスキャン」の数を決定する必要があるデータベースのレポートを作成しています。グループ内の最小レコード数をカウントする

スキャンテーブルには同じアイテムの複数のスキャンを含めることができますが、元のスキャンは特定のアイテムに一致する最も早い日付のスキャンであると特定できるCOUNTにのみ含めます。

この時私の最初の試みました:(約3倍あまりにも多くの)ものの

SELECT 
    _item_detail.job_id, 
    _item_group.group_id, 
    _scan.company_id, 
    DATE(scan_date_time) as scan_date, 
    COUNT(1) 
FROM _scan 
    INNER JOIN _item_detail ON _item_detail.company_id = _scan.company_id 
    AND 
    _item_detail.serial_number = _scan.serial_number 
    INNER JOIN _item_group ON _item_group.group_id = _item_detail.group_id 
WHERE _item_detail.job_id = '0326FCM' AND _scan.company_id = '152345' AND _item_group.group_id = 13 
GROUP BY 
_item_detail.job_id, 
_item_group.group_id, 
_scan.company_id, scan_date -- first_scan_count 
HAVING min(scan_date_time); 

これは、私の誤った結果を与えています。 MINレコードが各日付ごとに再計算されているため、1日目にMINが見つかった場合、3日目にそのレコードが見つかった可能性があります。

希望の結果を得るためにクエリを変更するにはどうすればよいですか?

+0

あなたが投稿することができますいくつかのサンプルデータと必要なo/p – Teja

答えて

2

...私はあなたのテーブルは、データが一緒にそれらをどのように関係するかレイアウトやされているかの完全にわからないんだけど、これは一般的な考え方です:

SELECT 
    _item_detail.job_id, 
    _item_group.group_id, 
    _scan.company_id, 
    DATE(scan_date_time) as scan_date, 
    COUNT(1) 
FROM 
    _scan s1 
    INNER JOIN _item_detail 
     ON _item_detail.company_id = s1.company_id 
     AND _item_detail.serial_number = s1.serial_number 
     AND _item_detail.job_id = '0326FCM' 
    INNER JOIN _item_group 
     ON _item_group.group_id = _item_detail.group_id 
     AND _item_group.group_id = 13 
WHERE 
    s1.company_id = '152345' 
    AND s1.scan_date_time = (
     SELECT MIN(s2.scan_date_time) 
     FROM _scan s2 
     WHERE 
      s2.company_id = s1.company_id 
      AND s2.serial_number = s1.serial_number 
    ) 
GROUP BY 
    _item_detail.job_id, 
    _item_group.group_id, 
    s1.company_id 
+0

これは私が必要としていたところで私を得ました。いくつかの小さな変更の後、私は行くのが良かった。ありがとう! –

0

私はあなたの質問にはあまり慣れていませんが、問題の説明に基づいて、各アイテムの最小スキャン日付、アイテムごとのグループ、外側の選択を実行するサブクエリを作成しますそれ。

これに似た何かが動作するはず
関連する問題