On Sunday, 5 January, 2020 16:39, gideo...@lutzvillevineyards.com wrote: >I have the following SQLITE query : > >SELECT BlokkeklaarAliasnaam, BlokkeklaarKultivar, sum(BlokkeklaarSkatting) >FROM Blokkeklaar >GROUP BY BlokkeklaarAliasnaam, BlokkeklaarKultivar; > >I cannot figure out how to update a column (i.e. >BlokkeklaarSkattingKultAliasnaam) with the value of >sum(BlokkeklaarSkatting) >in the above statement.
>This refers to a single table. First of all, you cannot perform updates with a SELECT statement -- you need an UPDATE statement for that ;) UPDATE Blokkeklaar as O SET BlokkeklaarSkattingKultAliasnaam = (SELECT sum(BlokkeklaarSkatting) FROM Blokkeklaar WHERE BlokkeklaarAliasnaam IS O.BlokkeklaarAliasnaam AND BlokkeklaarKultivar IS O.BlokkeklaarKultivar); You may use triggers so that Blokkeklaar.BlokkeklaarSkattingKultAliasnaam is always kept up-to-date (assuming that you start from an empty table or run the above update once to make it current before making further updates, after which you never need to run the above update again): CREATE TRIGGER ins_Blokkeklaar AFTER INSERT ON Blokkeklaar BEGIN UPDATE Blokkeklaar AS O SET BlokkeklaarSkattingKultAliasnaam = (SELECT sum(BlokkeklaarSkatting) FROM Blokkeklaar WHERE BlokkeklaarAliasnaam IS O.BlokkeklaarAliasnaam AND BlokkeklaarKultivar IS O.BlokkeklaarKultivar) WHERE BlokkeklaarAliasnaam IS NEW.BlokkeklaarAliasnaam AND BlokkeklaarKultivar IS NEW.BlokkeklaarKultivar; END; CREATE TRIGGER del_Blokkeklaar AFTER DELETE ON Blokkeklaar BEGIN UPDATE Blokkeklaar AS O SET BlokkeklaarSkattingKultAliasnaam = (SELECT sum(BlokkeklaarSkatting) FROM Blokkeklaar WHERE BlokkeklaarAliasnaam IS O.BlokkeklaarAliasnaam AND BlokkeklaarKultivar IS O.BlokkeklaarKultivar) WHERE BlokkeklaarAliasnaam IS OLD.BlokkeklaarAliasnaam AND BlokkeklaarKultivar IS OLD.BlokkeklaarKultivar; END; CREATE TRIGGER upd_Blokkeklaar AFTER UPDATE OF BlokkeklaarSkatting, BlokkeklaarAliasnaam, BlokkeklaarKultivar ON Blokkeklaar BEGIN UPDATE Blokkeklaar AS O SET BlokkeklaarSkattingKultAliasnaam = (SELECT sum(BlokkeklaarSkatting) FROM Blokkeklaar WHERE BlokkeklaarAliasnaam IS O.BlokkeklaarAliasnaam AND BlokkeklaarKultivar IS O.BlokkeklaarKultivar) WHERE BlokkeklaarAliasnaam IS OLD.BlokkeklaarAliasnaam AND BlokkeklaarKultivar IS OLD.BlokkeklaarKultivar AND (OLD.BlokkeklaarAliasnaam IS NOT NEW.BlokkeklaarAliasnaam OR OLD.BlokkeklaarKultivar IS NOT NEW.BlokkeklaarKultivar); UPDATE Blokkeklaar AS O SET BlokkeklaarSkattingKultAliasnaam = (SELECT sum(BlokkeklaarSkatting) FROM Blokkeklaar WHERE BlokkeklaarAliasnaam IS O.BlokkeklaarAliasnaam AND BlokkeklaarKultivar IS O.BlokkeklaarKultivar) WHERE BlokkeklaarAliasnaam IS NEW.BlokkeklaarAliasnaam AND BlokkeklaarKultivar IS NEW.BlokkeklaarKultivar; END; You will, of course, need an index on Blokkeklaar (BlokkeklaarAliasnaam, BlokkeklaarKultivar) unless you cherish slowness due to table scans -- it will be even faster if this is a covering index such as Blokkeklaar (BlokkeklaarAliasnaam, BlokkeklaarKultivar, BlokkeklaarSkatting). And you may, of course, use == and <> in place of IS and IS NOT if the correponding columns are constrained NOT NULL in the table definition. Otherwise, the above treats NULL as a distinct value. If you want NULL to be indistinct you will need to make some changes. Also, note that the sum(...) aggregate returns NULL if there is nothing to sum or all the values to sum are NULL. If you want that to be 0.0 instead, then change all uses of sum(...) to total(...) -- The fact that there's a Highway to Hell but only a Stairway to Heaven says a lot about anticipated traffic volume. _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users