On Monday, 18 February, 2019 02:27, Rocky Ji <rockyji3...@gmail.com>:
>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? Why? Would you like the prose to not use the words "the" and "then" as well? --- The fact that there's a Highway to Hell but only a Stairway to Heaven says a lot about anticipated traffic volume. >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 _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users