Optimizing a stored procedure
"IN ( SELECT ... )" optimizes very poorly; switch to a JOIN.
CREATE/DROP TABLE is slow, especially on Windows.
ReportThreeStamp seems static; why not build it as a non-TEMPORARY TABLE, and do so only once.
(case when (SUM(count) is null) then 0 else SUM(count) end) --> IFNULL(SUM(count), 0))
Your temp tables seem to have no indexes; this leads to slow table scans.  Suggest this syntax to create an index while creating and populating:

CREATE TABLE x ( PRIMARY KEY (y) ) SELECT ...
How many rows in the tables?  If millions, we should talk about "summary tables" and how they could probably speed up the processing 10-fold.