Search Postgresql Archives

Re: Optimize Query

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Alban! Sorry.. that was my mistake


Original Query:
SELECT concat(company, ' ', customer_name_first, ' ', customer_name_last) AS customer,
       sum(revenue) AS revenue,
       sum(i.quantity) AS quantity,
       sum(i.cost) AS cost
FROM
  ( SELECT account.id,
           job.customerid,
           job.title,
           job.gps_lat,
           job.gps_long,
           status.label AS status,
           status.status_type_id,
           job.status_label_id,
           client."position",
           bill_item.quantity,
           client.businesstype,
           account.id AS clientid,
           client.name_first AS customer_name_first,
           client.name_last AS customer_name_last,
           job.id AS jobid,
           note.mobiuserid,
           bill_item.for_invoicing AS invoice,
           COALESCE(bill_item.unit_price, billable.unit_price, 0) AS unit_price,
           note.n_quote_status,
           COALESCE(bill_item.unit_cost, billable.unit_cost, 0) AS unit_cost,
           job.time_job,
           "user".name_first,
           "user".name_last,
           role.id AS roleid,
           role.name AS role_name,
           billable.billable_id AS taskid,
           COALESCE(labs.tag, billable.code) AS task_name,
           note.time_start,
           client.company,
           job.refnum,
           (COALESCE(bill_item.unit_cost, billable.unit_cost, 0) * bill_item.quantity) AS cost,
           (COALESCE(bill_item.unit_price, billable.unit_price, 0) * bill_item.quantity) AS revenue,
           bill_item.for_invoicing AS invoiceable,
           COALESCE(extract('epoch'
                            FROM bill.ts_creation AT TIME ZONE 'UTC'), bill_item.invoice_id, NULL) IS NOT NULL AS invoiced
   FROM ja_clients AS account
   JOIN ja_customers AS client ON client.clientid = account.id
   JOIN ja_jobs AS job ON client.id=job.customerid
   JOIN ja_notes AS note ON note.jobid = job.id
   JOIN dm.bill_items AS bill_item ON bill_item.bill_item_id=note.bill_item_id
   LEFT JOIN dm.bills AS bill ON bill.bill_id=bill_item.bill_id
   LEFT JOIN dm.invoices AS invoice ON invoice.invoice_id=bill.invoice_id
   OR invoice.invoice_id=bill_item.invoice_id
   LEFT JOIN dm.billables AS billable ON billable.billable_id=note.billable_id
   LEFT JOIN dm.labors AS labs ON labs.billable_id = billable.billable_id
   JOIN ja_mobiusers AS "user" ON "user".id = note.mobiuserid
   JOIN ja_status AS status ON status.id = job.status_label_id
   JOIN ja_role AS ROLE ON ROLE.id="user".user_type
   WHERE note.note_type::text = ANY (ARRAY[ ('time'::CHARACTER VARYING)::text,
                                            ('part'::CHARACTER VARYING)::text ])
     AND NOT job.templated
     AND NOT job.deleted
     AND job.clientid = 6239
     AND time_job >= 1438351200
     AND time_job <= 1448888340
     AND bill_item.for_invoicing = TRUE) AS i
LEFT JOIN
  (SELECT customerid,
          SUM(cost) AS cost,
          SUM(quantity) AS quantity
   FROM
     (SELECT account.id,
             job.customerid,
             job.title,
             job.gps_lat,
             job.gps_long,
             status.label AS status,
             status.status_type_id,
             job.status_label_id,
             client."position",
             bill_item.quantity,
             client.businesstype,
             account.id AS clientid,
             client.name_first AS customer_name_first,
             client.name_last AS customer_name_last,
             job.id AS jobid,
             note.mobiuserid,
             bill_item.for_invoicing AS invoice,
             COALESCE(bill_item.unit_price, billable.unit_price, 0) AS unit_price,
             note.n_quote_status,
             COALESCE(bill_item.unit_cost, billable.unit_cost, 0) AS unit_cost,
             job.time_job,
             "user".name_first,
             "user".name_last,
             ROLE.id AS roleid,
                  ROLE.name AS role_name,
                       billable.billable_id AS taskid,
                       COALESCE(labs.tag, billable.code) AS task_name,
                       note.time_start,
                       client.company,
                       job.refnum,
                       (COALESCE(bill_item.unit_cost, billable.unit_cost, 0) * bill_item.quantity) AS cost,
                       (COALESCE(bill_item.unit_price, billable.unit_price, 0) * bill_item.quantity) AS revenue,
                       bill_item.for_invoicing AS invoiceable,
                       COALESCE(extract('epoch'
                                        FROM bill.ts_creation AT TIME ZONE 'UTC'), bill_item.invoice_id, NULL) IS NOT NULL AS invoiced
      FROM ja_clients AS account
      JOIN ja_customers AS client ON client.clientid = account.id
      JOIN ja_jobs AS job ON client.id=job.customerid
      JOIN ja_notes AS note ON note.jobid = job.id
      JOIN dm.bill_items AS bill_item ON bill_item.bill_item_id=note.bill_item_id
      LEFT JOIN dm.bills AS bill ON bill.bill_id=bill_item.bill_id
      LEFT JOIN dm.invoices AS invoice ON invoice.invoice_id=bill.invoice_id
      OR invoice.invoice_id=bill_item.invoice_id
      LEFT JOIN dm.billables AS billable ON billable.billable_id=note.billable_id
      LEFT JOIN dm.labors AS labs ON labs.billable_id = billable.billable_id
      JOIN ja_mobiusers AS "user" ON "user".id = note.mobiuserid
      JOIN ja_status AS status ON status.id = job.status_label_id
      JOIN ja_role AS ROLE ON ROLE.id="user".user_type
      WHERE note.note_type::text = ANY (ARRAY[ ('time'::CHARACTER VARYING)::text,
                                               ('part'::CHARACTER VARYING)::text ])
        AND NOT job.templated
        AND NOT job.deleted
        AND job.clientid = 6239
        AND time_job >= 1438351200
        AND time_job <= 1448888340
        AND n_quote_status = 0 ) AS note_detail_report_view
   WHERE 1=1
     AND clientid = 6239
     AND time_job >= 1438351200
     AND time_job <= 1448888340
     AND n_quote_status = 0
   GROUP BY customerid) AS a ON a.customerid = i.customerid
WHERE 1=1
  AND clientid = 6239
  AND time_job >= 1438351200
  AND time_job <= 1448888340
  AND invoice = TRUE
GROUP BY customer,
         a.cost,
         a.quantity
ORDER BY revenue DESC

Explain analyze link:

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux