Awesome, thanks for the detailed analysis; this is why I love mailing lists.
It seems you jumped to the meat directly, in the opening of my question, notice the words "scenario" and "given". I am sure you know what they mean, but for record: the links I gave help in "reproducing the problem" in a minimal viable way. Don't worry too much about ROWID, there are no deletes/updates on our little example. Finally, please reread the OP, I explicitly mentioned the conditions/relations exactly as they are supposed to be; if the words team / player / coach make you uncomfortable, use abcd... Now, can we get the desired result without nested `select`s? On Mon, Feb 18, 2019, 10:56 AM Keith Medcalf <kmedc...@dessus.com wrote: > > > create table coaches (coach_name text); > > create table players ( > playerName text not null, > salary integer, > fk_coach text, > constraint abc foreign key (fk_coach) references coaches > (coach_name) > ); > > create table matches ( > playedAgainst text not null, > totalScore integer not null, > bets real not null > ); > > create table players_matches ( > fk_match integer, > fk_player integer, > constraint mno foreign key (fk_player) references players (ROWID), > constraint xyz foreign key (fk_match) references matches (ROWID) > ); > > 1) You do not have any columns in either PLAYERS or MATCHES called > ROWID. Foreign Keys may only refer to explicitly named columns. > 2) The tables have no PRIMARY KEY. Therefore there is no way to identify > a particular set of attributes in a table (tuple). > 3) text fields for playerName and Coach_Name are ill defined (case > sensitive/insensitive? Unique?) > 4) Parent Keys should be UNIQUE, Child Keys may be unique (1:1) or not > unique (1:N) (but nevertheless must be indexed) > > Your data structure does not model reality. Players are on Teams. > Coaches coach Teams. I suppose you could short-circuit and eliminate Teams > by assigning Players to Coaches, but that means the same coach may never > coach different teams. Matches are between Teams (or coaches players if > you have gotten rid of teams). > > Or is this to model school-children at recess, where the so-called team is > merely the happenstance of the "John Picks Chris" and "Alice Picks Don" > verses the next recess where "John Picks Don" and "Alice gets stuck with > Chris"? > > In any event, why do you not use table generating subqueries that return > the data that you want to play with? In other words, once you know what > data you need then you generate that data. > > For example. You say " for a match X, profit/match is `sum(salary of all > players playing in X) - X.bets" > > So let us compute that using your wierd and invalid schema: > > select matches.rowid as match, (select sum(salary) > from players, players_matches > where players.rowid == > players_matches.fk_player > and players_matches.fk_match == > matches.rowid) - matches.bets AS profitmatch > from matches > ; > > > > > So now you have the "profitmatch" for each match. > > The you also want a bunch of detail crap using the same wierd and invalid > schema: > > select fk_coach as coach_name, > matches.rowid as match_number, > matches.playedagainst as match, > playerName as player, > salary > from players, matches, players_matches > where players.rowid == players_matches.fk_player > and matches.rowid == players_matches.fk_match > ; > > And then you want to join those together based on the match: > > select fk_coach as coach_name, > matches.rowid as match_number, > matches.playedagainst as match, > playerName as player, > salary, > profitmatch as profit > from players, matches, players_matches, > ( > select matches.rowid as match, (select sum(salary) > from players, players_matches > where players.rowid == > players_matches.fk_player > and players_matches.fk_match == > matches.rowid) - matches.bets AS profitmatch > from matches > ) as profit > where players.rowid == players_matches.fk_player > and matches.rowid == players_matches.fk_match > and profit.match == matches.rowid > ; > > The SQL is correct and produces the results, however, since the schema is > invalid it is difficult to actually run it. Simplifications are possible > (there is no point in including the "matches" table twice, for example, and > the correlated subquery could be put right in the main query, and if the > database schema itself were normalized, then even further simplifications > would be possible). > > --- > 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 Rocky Ji > >Sent: Sunday, 17 February, 2019 20:19 > >To: SQLite mailing list > >Subject: Re: [sqlite] How to get aggregate without reducing number of > >rows (repeats are ok)? > > > >@Keith > > > >Thanks. I am new to SQL and DB in general; please clarify what *is it > >valid* means. How do I check validity of schema? > > > >On Mon, Feb 18, 2019, 1:17 AM Keith Medcalf <kmedc...@dessus.com > >wrote: > > > >> > >> Nice schema. Do you have a valid one? > >> > >> > >> --- > >> 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 Rocky Ji > >> >Sent: Sunday, 17 February, 2019 09:47 > >> >To: SQLite mailing list > >> >Subject: [sqlite] How to get aggregate without reducing number of > >> >rows (repeats are ok)? > >> > > >> >Hello everyone, > >> > > >> >How can I prevent group by clause from reducing the number of rows > >> >without > >> >affecting accuracy of what aggregate functions provide? > >> > > >> >Scenario: > >> >My club has-many coaches. > >> >Each coach trains a team of players. > >> >Of course, a player has-many matches and a match has-many players. > >> >Given the schema: https://pastebin.com/raw/C77mXsHJ > >> >and sample data: https://pastebin.com/raw/GhsYktRS > >> > > >> >I want a result like: https://pastebin.com/raw/stikDvYS > >> > > >> >NOTE: for a match X, profit/match is `sum(salary of all players > >> >playing in > >> >X) - X.bets` > >> > > >> >To get the result, here's what I came up with: > >> >https://pastebin.com/ckgicBWS > >> > > >> >If I un-comment those lines, I get the profit column but rows are > >> >reduced, > >> >how can I prevent that? > >> > > >> >Thanks, > >> >Rocky. > >> >_______________________________________________ > >> >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 > > > > _______________________________________________ > 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