2013-05-04 28 views
0

我有四個表格,Companies,Vehicles,Quotes和PhoneRequests。如何根據時間從兩個單獨的表中獲取計數?

公司可能會在其車輛上收到報價和請求。

每個報價和要求都加蓋了一段時間。

我想找到行情的數量,並要求各公司每月在收到只要要麼行情或請求的數量是大於0

更大,我不知道該怎麼組這樣來自兩個獨立表格的月份是相同的。

這裏是我到目前爲止有:

SELECT 
    company.name `company`, 
    vehicle.name `vehicle`, 
    DATE_FORMAT(COALESCE(quote.qtime, pr.date),'%Y-%m') `month`, 
    COUNT(DISTINCT quote.qid) `quotes`, 
    COUNT(DISTINCT pr.id) `phone_reqs` 
FROM companies company 
    LEFT JOIN vehicles vehicle ON vehicle.compid=company.cid 
    LEFT JOIN quote_vehicle qv ON qv.vehicle_id=vehicle.vid 
    LEFT JOIN quotes quote ON qv.quote_id=quote.qid 
    LEFT JOIN phone_requests pr ON pr.vehicle_id=vehicle.vid AND quote.qtime IS NULL OR DATE_FORMAT(quote.qtime,'%Y-%m')=DATE_FORMAT(pr.date,'%Y-%m') 
GROUP BY 
    company.cid, `month` 
HAVING 
    quotes > 0 OR phone_reqs > 0 
ORDER BY 
    `month` DESC, `company` ASC 

但它似乎是在歸結到phone_reqs錯了公司,因爲AND quote.qtime IS NULL OR DATE_FORMAT(quote.qtime,'%Y-%m')=DATE_FORMAT(pr.date,'%Y-%m')位的可能。我不知道如何確保報價和請求在同一個月發生。

回答

1

可能這可以幫助

SELECT 
    company.name `company`, 
    vehicle.name `vehicle`, 
    month, 
    quote.quotes, 
    pr.phone_reqs 
FROM companies company 
    LEFT JOIN vehicles vehicle ON vehicle.compid=company.cid 
    LEFT JOIN quote_vehicle qv ON qv.vehicle_id=vehicle.vid 
LEFT JOIN (SELECT COUNT(DISTINCT qid) quotes, DATE_FORMAT(qtime,'%Y-%m') `month` FROM quotes GROUP BY `month`) quote ON quote.qid = qv.quote_id 
LEFT JOIN (SELECT COUNT(DISTINCT id) `phone_reqs`, DATE_FORMAT(date,'%Y-%m') `month` FROM phone_requests GROUP BY `month`) pr ON pr.phone_reqs = vehicle.vid AND quote.month = pr.month 
GROUP BY company.cid 
HAVING 
    quotes > 0 OR phone_reqs > 0 
ORDER BY 
    `month` DESC, `company` ASC 
+0

現在嘗試了這一點。其中有一些錯誤,但我會看看我是否可以使其工作。感謝您的建議。 – mpen 2013-05-04 22:31:40

+0

什麼是錯誤?請在 – 2013-05-04 22:36:27

+0

SELECT部分​​中'month'不明確,'quote.qid'未知(需要放在子查詢中),'pr.phone_reqs = vehicle.vid'應該是'pr.vehicle_id = vehicle.vid'。在修復之後,分組關閉。需要按月份和公司分組,但實際上僅按月份分組。 – mpen 2013-05-04 22:38:18

0

提花出來的東西:

SELECT `month`, `company`, SUM(nquotes) nquotes, SUM(nphone) nphone FROM ((
    SELECT 
     DATE_FORMAT(quote.qtime,'%Y-%m') `month`, 
     company.name `company`, 
     COUNT(*) `nquotes`, 
     0 `nphone`, 
     company.cid `company_id` 
    FROM 
     companies company 
     JOIN vehicles vehicle ON vehicle.compid=company.cid 
     JOIN quote_vehicle qv ON qv.vehicle_id=vehicle.vid 
     JOIN quotes quote ON qv.quote_id=quote.qid 
    GROUP BY `month`, `company_id` 
) UNION ALL (
    SELECT 
     DATE_FORMAT(pr.date,'%Y-%m') `month`, 
     company.name `company`, 
     0 `nquotes`, 
     COUNT(*) `nphone`, 
     company.cid `company_id` 
    FROM 
     companies company 
     JOIN vehicles vehicle ON vehicle.compid=company.cid 
     JOIN phone_requests pr ON pr.vehicle_id=vehicle.vid 
    GROUP BY `month`, `company_id` 
)) master 
GROUP BY `month`, `company_id` 
ORDER BY `month` DESC, `company` ASC  
1

你說

......大概是因爲AND quote.qtime IS NULL OR DATE_FORMAT(quote.qtime,'%Y-%m')=DATE_FORMAT(pr.date,'%Y-%m')位。

如何添加一個簡單的WHERE子句?

SELECT 
    company.name `company`, 
    vehicle.name `vehicle`, 
    DATE_FORMAT(COALESCE(quote.qtime, pr.date),'%Y-%m') `month`, 
    COUNT(DISTINCT quote.qid) `quotes`, 
    COUNT(DISTINCT pr.id) `phone_reqs` 
FROM companies company 
    LEFT JOIN vehicles vehicle ON vehicle.compid=company.cid 
    LEFT JOIN quote_vehicle qv ON qv.vehicle_id=vehicle.vid 
    LEFT JOIN quotes quote ON qv.quote_id=quote.qid 
    LEFT JOIN phone_requests pr ON pr.vehicle_id=vehicle.vid 
WHERE 
    (quote.qtime IS NULL) OR (quote.qtime BETWEEN pr.date AND pr.date - 2592000) 
GROUP BY 
    company.cid, `month` 
HAVING 
    quotes > 0 OR phone_reqs > 0 
ORDER BY 
    `month` DESC, `company` ASC 

注:2592000代表30天(假設你的日期時間戳)...

+0

MySQL DATETIMEs實際上,正如它們在'DATE_FORMAT'中的使用所暗示的那樣:-)相應地修改了查詢,但它沒有打開任何東西,即使我完全取出WHERE。一定是別的東西。 – mpen 2013-05-05 00:49:47

相關問題