0

Company、Vehicles、Quotes、PhoneRequests の 4 つのテーブルがあります。

企業は、車両に関する見積もりと依頼の両方を受け取ることができます。

各見積もりとリクエストには、時刻がスタンプされます。

見積もりまたはリクエストの数が 0 より大きい限り、各会社が各月に受け取った見積もりとリクエストの数を見つけたいと考えています。

2 つの別々のテーブルの月が同じになるようにグループ化する方法がわかりません。

ここに私がこれまでに持っているものがあります:

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')です。ただし、見積もりとリクエストが同じ月に行われたことを確認する方法が他にわかりません。

4

3 に答える 3

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 日を表します (日付がタイムスタンプであると仮定します)...

于 2013-05-04T23:33:24.997 に答える
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
于 2013-05-04T22:24:28.180 に答える
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    
于 2013-05-04T22:58:22.247 に答える