我有四张桌子,公司,车辆,报价和电话请求。
公司可能会收到其车辆的报价和请求。
每个报价和请求都标有时间。
我想查找每个公司在每个月收到的报价和请求数,只要 报价或请求数大于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')
位。我不知道如何确保报价和请求在同一个月内发生。
答案 0 :(得分: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
答案 1 :(得分: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天(假设您的日期是时间戳)...
答案 2 :(得分: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