Since you are eventually going to come to the part where you need to include 
the quote for the correct target, lets include that too, just to skip ahead:

  select (SELECT ed 
            from Tasks as I
           where I.task = 'QUOTE' 
             and I.Pid = O.Pid
             and I.target like '%' || O.Target || '%'
         ), 
         max(O.ed),
         O.target, 
         sum(O.amt) 
    from Tasks as O
   where ...
group by target 
  having sum(amt) > 0;

NB:  The data is not relational.  You should make it so and not overload 
multiple entries into a single value (ie, make sure your data is at in at least 
first normal form).  Then you can replace the "like" with a simple equals.  

---
The fact that there's a Highway to Hell but only a Stairway to Heaven says a 
lot about anticipated traffic volume.

>-----Original Message-----
>From: sqlite-users [mailto:sqlite-users-
>boun...@mailinglists.sqlite.org] On Behalf Of jose isaias cabrera
>Sent: Wednesday, 18 October, 2017 16:39
>To: SQLite mailing list
>Subject: Re: [sqlite] Grouping and grabbing one item
>
>
>Ok, I missed a condition.  Imagine this set of data,
>
>
>CREATE TABLE Tasks (
>  id INTEGER PRIMARY KEY,
>  Pid INTEGER,
>  cust TEXT,
>  period TEXT,
>  bd TEXT,
>  ed TEXT,
>  task TEXT,
>  target TEXT,
>  amt REAL
>);
>
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(1,'A','aa','2017-09-27','2017-09-27','QUOTE','es-ES fr-FR it-IT',0);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(1,'A','aa','2017-09-28','2017-10-01','DOC','es-ES',100);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(1,'A','aa','2017-09-28','2017-10-01','DOC','it-IT',120);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(1,'A','aa','2017-09-28','2017-10-01','DOC','fr-FR',110);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(1,'A','aa','2017-09-28','2017-10-01','VAL','es-ES',70);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(1,'A','aa','2017-09-28','2017-10-01','VAL','fr-FR',75);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(1,'A','aa','2017-09-28','2017-10-01','VAL','it-IT',80);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(2,'Z','aa','2017-09-27','2017-09-27','QUOTE','es-ES fr-FR it-IT',0);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(2,'Z','aa','2017-09-28','2017-10-01','DOC','es-ES',100);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(2,'Z','aa','2017-09-28','2017-10-01','DOC','it-IT',120);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(2,'Z','aa','2017-09-28','2017-10-01','DOC','fr-FR',110);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(2,'Z','aa','2017-09-28','2017-10-01','VAL','es-ES',70);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(2,'Z','aa','2017-09-28','2017-10-01','VAL','fr-FR',75);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(2,'Z','aa','2017-09-28','2017-10-01','VAL','it-IT',80);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(3,'A','aa','2017-10-03','2017-10-04','QUOTE','es-ES fr-FR it-IT',0);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(3,'A','aa','2017-09-28','2017-10-01','DOC','es-ES',200);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(3,'A','aa','2017-09-28','2017-10-01','DOC','it-IT',320);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(3,'A','aa','2017-09-28','2017-10-01','DOC','fr-FR',410);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(3,'A','aa','2017-09-28','2017-10-01','VAL','es-ES',170);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(3,'A','aa','2017-09-28','2017-10-01','VAL','fr-FR',275);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(3,'A','aa','2017-09-28','2017-10-01','VAL','it-IT',180);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(4,'F','aa','2017-09-27','2017-09-27','QUOTE','es-ES fr-FR it-IT',0);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(4,'F','aa','2017-09-28','2017-10-01','DOC','es-ES',100);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(4,'F','aa','2017-09-28','2017-10-01','DOC','it-IT',120);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(4,'F','aa','2017-09-28','2017-10-01','DOC','fr-FR',110);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(4,'F','aa','2017-09-28','2017-10-01','VAL','es-ES',70);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(4,'F','aa','2017-09-28','2017-10-01','VAL','fr-FR',75);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(4,'F','aa','2017-09-28','2017-10-01','VAL','it-IT',80);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(5,'F','ab','2017-09-27','2017-09-27','QUOTE','es-ES fr-FR it-IT',0);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(5,'F','ab','2017-09-28','2017-10-01','DOC','es-ES',100);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(5,'F','ab','2017-09-28','2017-10-01','DOC','it-IT',120);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(5,'F','ab','2017-09-28','2017-10-01','DOC','fr-FR',110);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(5,'F','ab','2017-09-28','2017-10-01','VAL','es-ES',70);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(5,'F','ab','2017-09-28','2017-10-01','VAL','fr-FR',75);
>INSERT INTO Tasks (Pid,cust,period,bd,ed,task,target,amt) VALUES
>(5,'F','ab','2017-09-28','2017-10-01','VAL','it-IT',80);
>
>I know I can do,
>
>select max(ed),target, sum(amt) from Tasks where cust='A' group by
>Pid,
>target HAVING amt > 0;
>
>to get,
>
>2017-10-01|es-ES|170.0
>2017-10-01|fr-FR|185.0
>2017-10-01|it-IT|200.0
>2017-10-01|es-ES|370.0
>2017-10-01|fr-FR|685.0
>2017-10-01|it-IT|500.0
>
>but I want the QUOTE ed for the correct Pid in front again.  I have
>no idea
>how to do this.  I was trying some JOINs,
>
>
>select ls.ed,max(ls.ed),ls.target, sum(amt) from Tasks ls JOIN Tasks
>cl ON
>(
>ls.Pid = cl.Pid AND
>  ls.task = 'QUOTE'
>) where cust='A' group by Pid, target HAVING amt > 0;
>
>sqlite> select ls.ed,max(ls.ed),ls.target, sum(amt) from Tasks ls
>JOIN Tasks
>cl ON
>   ...> (
>   ...>  ls.Pid = cl.Pid AND
>   ...>   ls.task = 'QUOTE'
>   ...> ) where cust='A' group by Pid, target HAVING amt > 0;
>Error: ambiguous column name: amt
>
>I need to get,
>
>2017-09-27,2017-10-01|es-ES|170.0
>2017-09-27,2017-10-01|fr-FR|185.0
>2017-09-27,2017-10-01|it-IT|200.0
>2017-10-04,2017-10-01|es-ES|370.0
>2017-10-04,2017-10-01|fr-FR|685.0
>2017-10-04,2017-10-01|it-IT|500.0
>
>Any help would be great.  I have to read on some JOINs.  Thanks.
>
>
>-----Original Message-----
>From: no...@null.net
>Sent: Wednesday, October 18, 2017 3:17 PM
>To: SQLite mailing list
>Subject: Re: [sqlite] Grouping and grabbing one item
>
>On Wed Oct 18, 2017 at 07:57:24PM +0200, Darko Volaric wrote:
>
>> select (SELECT ed from Tasks where task = 'QUOTE' and Pid = 1),
>> max(ed),target, sum(amt) from Tasks where Pid=1 group by target
>> HAVING amt > 0;
>
>When I first read that query I wondered if putting a query inside a
>select expression would execute it for each row. I don't know if that
>is the case, but here is the query plan:
>
>    explain query plan select (SELECT ed from Tasks where task =
>    'QUOTE' and Pid = 1), max(ed),target, sum(amt) from Tasks where
>    Pid=1 group by target HAVING amt > 0;
>
>0,0,0,"SCAN TABLE Tasks"
>0,0,0,"USE TEMP B-TREE FOR GROUP BY"
>0,0,0,"EXECUTE SCALAR SUBQUERY 1"
>1,0,0,"SCAN TABLE Tasks"
>
>It would appear that moving the subquery down into a FROM clause
>makes the
>query plan look slightly better. In my humble opinion it also makes
>the
>query easier to understand.
>
>explain query plan
>select
>q.ed,
>max(tasks.ed),
>target,
>sum(amt)
>from
>(SELECT ed from Tasks where task = 'QUOTE' and Pid = 1) q
>inner join
>Tasks
>on
>Pid=1
>group by
>q.ed,
>target
>HAVING
>amt > 0;
>
>0,0,0,"SCAN TABLE Tasks"
>0,1,1,"SEARCH TABLE Tasks USING AUTOMATIC PARTIAL COVERING INDEX
>(Pid=?)"
>0,0,0,"USE TEMP B-TREE FOR GROUP BY"
>
>The above is the case with version 3.16.2.
>
>
>--
>Mark Lawrence
>_______________________________________________
>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



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

Reply via email to