Make sure it gets the same results, but how about something like the below. The 
collate nocase on the cust field was also a good suggestion.

select
XtraF as PortalID,
ProjID,
A_No as GTXNo,
proj as ProjName,
lang as Target,
QuoteAvailable,
DeliveryDate,
sum(Xtra8) as PriceUSD,
0 as PriceCAD,
sum(ProjFund) as TransferCost,
XtraE as Department,
XtraA as BillTo,
pmuk as Contact,
'-' as Notes1,
'-' as Notes2
from LSOpenJobs as O
inner join
  (select ProjID, max(edate) as QuoteAvailable
  from LSOpenJobs
  where PSubClass = 'QuoteAppr'
  group by ProjID) as I
using (ProjID)
inner join
  (select ProjID, min(edate) as DeliveryDate
  from LSOpenJobs
  where PSubClass = 'Delivery'
  group by ProjID) as E
using (ProjID)
where lower(cust) = 'xerox'
and Xtra9 like '2017-09-%'
group by ProjID, lang
having sum(ProjFund) > 0;

selectid|order|from|detail
1|0|0|SCAN TABLE LSOpenJobs USING INDEX OjPid
2|0|0|SCAN TABLE LSOpenJobs USING INDEX OjPid
0|0|1|SCAN SUBQUERY 1 AS I
0|1|0|SEARCH TABLE LSOpenJobs AS O USING INDEX OjPid (ProjID=?)
0|2|2|SEARCH SUBQUERY 2 AS E USING AUTOMATIC COVERING INDEX (ProjID=?)
0|0|0|USE TEMP B-TREE FOR GROUP BY


Or maybe an index on PSubClass to speed up the subqueries?
sqlite> create index idx1 on LSOpenJobs (PSubClass, ProjID);
selectid|order|from|detail
1|0|0|SEARCH TABLE LSOpenJobs USING INDEX idx1 (PSubClass=?)
2|0|0|SEARCH TABLE LSOpenJobs USING INDEX idx1 (PSubClass=?)
0|0|1|SCAN SUBQUERY 1 AS I
0|1|0|SEARCH TABLE LSOpenJobs AS O USING INDEX OjPid (ProjID=?)
0|2|2|SEARCH SUBQUERY 2 AS E USING AUTOMATIC COVERING INDEX (ProjID=?)
0|0|0|USE TEMP B-TREE FOR GROUP BY


-----Original Message-----
From: sqlite-users [mailto:sqlite-users-boun...@mailinglists.sqlite.org] On 
Behalf Of jose isaias cabrera
Sent: Friday, October 20, 2017 2:22 PM
To: SQLite mailing list
Subject: [sqlite] Any change to make this query better?


Greetings!

This takes about 1.5 minutes to run with sqlite v3.20.1 with about 200K 
records

sqlite> explain query plan
   ...> SELECT
   ...>   O.XtraF AS PortalID,
   ...>   O.ProjID,
   ...>   O.A_No AS GTXNo,
   ...>   O.proj AS ProjName,
   ...>   O.lang AS Target,
   ...>   (SELECT max(edate) from LSOpenJobs AS I WHERE I.ProjID = O.ProjID 
AND

   ...>    I.PSubClass = 'QuoteAppr' ) AS QuoteAvailable,
   ...>   (SELECT min(edate) from LSOpenJobs AS E WHERE E.ProjID = O.ProjID 
AND

   ...>    PSubClass = 'Delivery') AS DeliveryDate,
   ...>   sum(O.Xtra8) AS PriceUSD,
   ...>   0 AS PriceCAD,
   ...>   sum(O.ProjFund) AS TransferCost,
   ...>   O.XtraE AS Department,
   ...>   O.XtraA AS BillTo,
   ...>   O.pmuk AS Contact,
   ...>   '-' AS Notes1,
   ...>   '-' AS Notes2
   ...>   from LSOpenJobs AS O WHERE lower(cust) = 'xerox' AND
   ...>                         Xtra9 LIKE  '2017-09-%'
   ...>                  GROUP BY ProjID,lang HAVING sum(ProjFund) > 0;
0|0|0|SCAN TABLE LSOpenJobs AS O USING INDEX OjPid
0|0|0|USE TEMP B-TREE FOR GROUP BY
0|0|0|EXECUTE CORRELATED SCALAR SUBQUERY 1
1|0|0|SEARCH TABLE LSOpenJobs AS I USING INDEX OjPid (ProjID=?)
0|0|0|EXECUTE CORRELATED SCALAR SUBQUERY 2
2|0|0|SEARCH TABLE LSOpenJobs AS E USING INDEX OjPid (ProjID=?)
sqlite>



_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to