2017-07-06 14 views
1

私は、すべてのクライアント、そのプロジェクト、各プロジェクトで費やされた時間、合計請求額、および請求書総数のリストを生成しようとしています。私は、クエリを実行すると複数のテーブルから合計を集計するMySQLクエリ

SELECT 
    c.name as client, 
    p.name as project, 
    SUM(t.hours) as hours, 
    SUM(ci.amount) as invoice_amount, 
    COUNT(ci.id) as number_invoices 
FROM 
    projects p 
    INNER JOIN client_master c ON c.harvest_id = p.client_id 
    INNER JOIN timesheet t ON t.project_id = p.id 
    LEFT OUTER JOIN projects_contracts pc ON pc.project_id = p.id 
    INNER JOIN contracts_invoices ci ON ci.contract_id = pc.contract_id 
GROUP BY 
    c.name, 
    p.name 
ORDER BY 
    c.name, 
    p.name, 
    t.hours 

、「時間」は正しく計算されているが、INVOICE_AMOUNTとnumber_invoicesのための合計/カウントがプロジェクトになく、テーブル内のインボイスの合計数に文脈的に結合されていません。私は()の合計の1をコメントアウトした場合、彼らは、両方しているとき、私は適切な値を得ることはありません。

期待される成果

クライアントA、プロジェクト1、1000年、$ 10,000 2

クライアントA、プロジェクト2、5000、$ 5,000 1件の

クライアントB、プロジェクト1、100、$ 3000と、1つの

実績

クライアントA、プロジェクト1、1000年、$ 150,000 20

クライアントA、プロジェクト2、5000、$ 50,000 81

クライアントB、プロジェクト1、100、$ 83000、私は「12

グループ化してステートメントに参加しようとしましたが、成功していませんでした。見落としているシンプルなものがあるのですか、それとも完全に書き直す必要がありますか?

+0

の作品賭け: //meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query) – Strawberry

+0

Help私はここで、私はこのクエリを大幅に縮小しました。他に何が見えると思いますか? – markjrubin

+0

両方の合計が入っていて、間違っている場合、値を取るときとはどのように違いますか?正しい値が誤った値よりも高いか低いか? –

答えて

-1

これが最善の方法ではないかもしれないが、私はそれを参照してください[なぜ私は非常に単純なSQLクエリであることを私には思える何のためにMCVEを提供する必要があります](HTTP

SELECT 
    c.name as client, 
    p.name as project, 
    t.hours as hours, 
    ci.amount as invoice_amount, 
    ci.count as number_invoices 
FROM 
    projects p 
    INNER JOIN client_master c 
     ON c.harvest_id = p.client_id 
    INNER JOIN (SELECT project_id, SUM(hours) AS hours FROM timesheet GROUP BY project_id) t 
     ON t.project_id = p.id 
    LEFT OUTER JOIN projects_contracts pc 
     ON pc.project_id = p.id 
    LEFT OUTER JOIN (SELECT contract_id, SUM(amount) AS amount, COUNT(DISTINCT id) AS count FROM contracts_invoices GROUP BY contract_id) ci 
     ON ci.contract_id = pc.contract_id 
GROUP BY 
    c.name, 
    p.name 
ORDER BY 
    c.name, 
    p.name, 
    t.hours 
+0

それはそれをしたようです。それはnullの請求書金額でいくつかのプロジェクトを生成しますが、それは私がそれらをどこからでも得ることができます。今、残りの数式を投げ込もうとする.... – markjrubin

0

請求書は契約に依存し、契約はオプションです(左側の結合)。 これも左結合になります。

SELECT 
    c.name as client, 
    p.name as project, 
    SUM(t.hours) as hours, 
    SUM(ci.amount) as invoice_amount, 
    COUNT(ci.id) as number_invoices 
FROM 
    projects p 
    INNER JOIN client_master c 
     ON c.harvest_id = p.client_id 
    INNER JOIN timesheet t 
     ON t.project_id = p.id 
    LEFT JOIN projects_contracts pc 
     ON pc.project_id = p.id 
    LEFT JOIN contracts_invoices ci 
     ON ci.contract_id = pc.contract_id 
GROUP BY 
    c.name, 
    p.name 
ORDER BY 
    c.name, 
    p.name, 
    t.hours 
+0

ありがとうスローン。私がそれをする前に、私は次のメッセージを受け取りました:ドキュメント #1104 - SELECTはMAX_JOIN_SIZE個以上の行を調べます。あなたのWHEREをチェックして、SELECT SQL_BIG_SELECTS = 1またはSET MAX_JOIN_SIZE =#を使用します。 – markjrubin

+0

テーブルの行数はいくつですか? MAX_JOIN_SIZEは何に設定されていますか?それを変更しようとしましたか? –

+0

SET SQL_BIG_SELECT = 1ステートメントをクエリの先頭に追加しました。今回は結果が出ましたが、データはまだ正しくありませんでした。 CLIENT、PROJECT、148.92,142956.00,54を受け取ったクライアント、プロジェクト、148.92、$ 10,000、3 – markjrubin

関連する問題