2012-04-06 65 views
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天被發現並再次計數。

如何修改我的查詢以獲得所需的結果?

+0

你能交一些示例數據和所需的o/p – Teja 2012-04-06 16:30:39

回答

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

這幾乎讓我在需要的地方。經過一些小的修改,我很高興去。謝謝! – 2012-04-06 18:14:42

0

我不完全按照你的查詢,但根據問題的描述,我會說創建一個子查詢,給每個項目的最低掃描日期,按項目分組,執行您的外部選擇那。