0

会社、仕事、および日付ごとにグループ化された「最初のスキャン」の数を決定する必要があるデータベースのレポートを作成しています。

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

これに対する私の最初の試みは次のとおりです。

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);

ただし、これにより誤った結果が得られます (約 3 倍多すぎます)。これは、日付ごとに MIN レコードが再計算されているためであると想定しているため、1 日目に分が見つかった場合、3 日目にも見つかって再度カウントされる可能性があります。

クエリを変更して目的の結果を得るにはどうすればよいですか?

4

2 に答える 2

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
于 2012-04-06T16:32:59.607 に答える
0

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

于 2012-04-06T16:28:56.097 に答える