2016-09-24 38 views
0

你好,我已代表其階段和歷史表顯示的時間文檔的文檔下面兩個表被轉移到下一個階段MySQL會以時間加入對最新記錄表

CREATE TABLE `document` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `description` text, 
    `stage` tinyint(4) NOT NULL DEFAULT '0', 
    `customer_name` varchar(100) DEFAULT NULL, 
    `creator_id` bigint(20) NOT NULL DEFAULT '0', 
    `customer_city` varchar(100) DEFAULT NULL, 
    `customer_state` varchar(100) DEFAULT NULL, 
    `customer_zip` varchar(50) DEFAULT NULL, 
    `customer_contact` varchar(100) DEFAULT NULL, 
    `number` varchar(100) DEFAULT NULL, 
    `latitude` float NOT NULL DEFAULT '0', 
    `longitude` float NOT NULL DEFAULT '0', 
    `creation_date` varchar(50) DEFAULT NULL, 
    `expanded_description` text, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `document_history` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `doc_id` bigint(20) NOT NULL, 
    `modifying_time` datetime DEFAULT NULL, 
    `changed_to_stage` tinyint(3) unsigned DEFAULT NULL, 
    `old_stage` tinyint(3) unsigned DEFAULT NULL, 
    `user_modified` bigint(20) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

我需要得到根據選定的時間段統計統計數據。例如,我需要知道在選定的時間段內有多少個文檔處於第1階段,但問題是,如果某個文檔在此期間處於幾個不同的階段 - 我只能計算最後一次階段,例如如果商務部在第一階段之後,在第2階段 - 我要指望它僅適用於階段2

這裏是我到現在爲止:

SELECT 
round(sum(case when dh.modifying_time between '2016-09-15' and '2016-09-24' and dh.changed_to_stage = 1 then 1 else 0 end),0) entry_count, 
round(sum(case when dh.modifying_time between '2016-09-15' and '2016-09-24' and dh.changed_to_stage = 3 then 1 else 0 end),0) pricing_count, 
round(sum(case when dh.modifying_time between '2016-09-15' and '2016-09-24' and dh.changed_to_stage = 5 then 1 else 0 end),0) executed_count, 
round(sum(case when dh.modifying_time between '2016-09-15' and '2016-09-24' and dh.changed_to_stage = 7 then 1 else 0 end),0) approved_count, 
round(sum(case when dh.modifying_time between '2016-09-15' and '2016-09-24' and dh.changed_to_stage = 9 then 1 else 0 end),0) canceled_count 
FROM document doc join document_history dh on doc.id=dh.doc_id 

這裏的問題是,該文件是如果在那個時期處於兩個不同的階段,則計數兩次。

任何幫助將不勝感激。

感謝和問候

+0

請添加樣本數據進行重現。同時告訴我們將歷史記錄放入歷史記錄表的規則。你是否也保留了歷史上的實際記錄? –

+0

創建文檔時添加歷史記錄表中的記錄,同樣如果文檔從一個階段移動到另一個階段。 –

回答

1

要選擇剛剛最後階段,那麼你可以做的where邏輯。但是,我建議移動日期條件爲WHERE第一和擺脫ROUND()(用於intengers真的?):

SELECT sum(case when dh.changed_to_stage = 1 then 1 else 0 end) as entry_count, 
     sum(case when dh.changed_to_stage = 3 then 1 else 0 end) as pricing_count, 
     sum(case when dh.changed_to_stage = 5 then 1 else 0 end) as executed_count, 
     sum(case when dh.changed_to_stage = 7 then 1 else 0 end) as approved_count, 
     sum(case when dh.changed_to_stage = 9 then 1 else 0 end) as canceled_count 
FROM document doc join 
    document_history dh 
    on doc.id = dh.doc_id 
WHERE dh.modifying_time between '2016-09-15' and '2016-09-24' and 
     dh.modifying_time = (SELECT MAX(dh2.modifying_time) 
          FROM document_history dh2 
          WHERE dh2.doc_id = dh.doc_id AND 
           dh2.modifying_time between '2016-09-15' and '2016-09-24' 
         ); 

注:

  • 不要存放日期爲字符串(例如作爲creation_date)。
  • 您應該使用帶日期或日期時間的between。你的表情可能不符合你的意願。把它寫成dh.modifying_time >= '2016-09-15' and dh.modifying_time < '2016-09-25',這可能是你想要的。
  • 如果要保留所有文檔,請使用left join而不是inner join,並將where條件移至on子句。
  • round()用整數參數?我只是沒有得到那一個。
  • 而且,正如所寫的,查詢完全不需要document表格,只有document_history。你可能會認爲from document_history是一個簡化。
+0

所有日期都是日期時間,這裏是示例中的一個錯誤,我正在刪除一些列(表中有40列)。你對這一輪是正確的 - 這是錯誤的,我會刪除它。我會測試你的解決方案,謝謝你的建議 –

+0

我認爲範圍檢查應該只是'dh.modifying_time <'2016-09-25''。如果一個舞臺在09/14最後一次改變,它在從09/15到09/24的階段仍然是同一階段。和'document'表連接可能是不必要的。 –

+0

@PaulSpiegel。 。 。這是一個好點。正如所寫的,查詢不需要「join」,只需要「document_history」表。 –

相關問題