webForumDet fria alternativet

Uträkning i SQL

6 svar · 281 visningar · startad av Pikkenix

PikkenixMedlem sedan mars 2003116 inlägg
#1

Försökt att fixa det här länge nu men utan något vidare resultat.
Det här är vad jag vill åstakomma:

Jag vill få fram alla rader i tabell1 som värdet tal är större än vad värdet tal2 är totalt (SUM(tabell2.tal2))för alla rader i tabell2 med samma id (tabell1.id = tabell2.id) som i tabell1. Vill få fram hur mycket större tal1 är än alla dessa tal2 tillsammans om det skulle vara fallet, är tal1 = SUM(tabell2.tal2) så vill jag inte få fram raden i tabell1.

Har användt mig av följande SQL-sats och liknande: SELECT tabell1.namn, (tabell1.tal - SUM(tabell2.tal)) as nytttal FROM tabell1, tabell2 WHERE tabell1.id = 1 AND tabell2.id = tabell1.id GROUP BY tabell1.namn

aasahMedlem sedan mars 20034 471 inlägg
#2

Tycker inte beskrivningen går ihop med frågan...? Ska det bara gälla för tabell1.id=1??? Annars ska det villkoret bort.

Om du INTE använder MySQL borde följande funka:

SELECT T.namn, T.tal, sum(S.tal) as nytttal FROM tabell1 T, tabell2 S
WHERE T.id = S.id AND T.tal >
(SELECT sum(tal) from tabell2 X where X.id = S.id);

Visserligen får du räkna ut differensen från resultatet då...

Men de tal som summeras i tabell2 är de tal som har samma id som ditt id i tabell1. Mitt exempel ovan använder inte GROUP BY eftersom din förklaringstext inte har motiverat vad du ska med det till...? Enligt din beskrivning verkar det alltså inte behövas?

PikkenixMedlem sedan mars 2003116 inlägg
#3

Använder ju tyvärr mySQL fungerar inte detta då - isåfall varför inte, det är väl en vanlig nestad sökning?

Fattar inte varför jag själv inte tänkt på det - oftast är det lättare än vad man tror. Kan inte testa förrens ikväll dock då jag sitter på jobbet just nu.

aasahMedlem sedan mars 20034 471 inlägg
#4

Pikkenix skrev:

Använder ju tyvärr mySQL fungerar inte detta då - isåfall varför inte, det är väl en vanlig nestad sökning?...

Jag är absolut ingen expert på MySQL, ska precis börja använda den varianten själv. Men om jag har fattat rätt så klarar MySQL inga subqueries (nästlade sökningar).

OM MySQL klarar vyer borde följande funka:

CREATE VIEW summa(id, talSumma) AS
SELECT id, sum(tal) from tabell2
Group BY id;

SELECT T.namn, T.tal, S.talSumma FROM tabell1 T, Summa S
WHERE T.id = S.id AND T.tal > S.talSumma;

Vet dock inte om CREATE VIEW funkar eller ej i MySQL...

PikkenixMedlem sedan mars 2003116 inlägg
#5

Saxat från MySQL's hemsida: "Starting with MySQL 4.1, all subquery forms and operations that the SQL standard requires are supported, as well as a few features that are MySQL-specific.

With earlier MySQL versions, it was necessary to work around or avoid the use of subqueries, but people starting to write code now will find that subqueries are a very useful part of the MySQL toolkit."

Med andra ord så får man köra på beta-versionen som är 4.1+ och inte production-versionen.

PikkenixMedlem sedan mars 2003116 inlägg
#6

Testat nu och stött på ett nytt problem, om det inte finns ngra rader i tabell2 så returneras (rätta mig om jag har fel) Null och inte 0... vill att det ska returneras 0 isåfall så tror jag att det ska fungera, som det är nu får jag inte fram något då tabell1.id < Null

Det är iafall vad jag tror är felet...

aasahMedlem sedan mars 20034 471 inlägg
#7

Pikkenix skrev:

Testat nu och stött på ett nytt problem, om det inte finns ngra rader i tabell2 så returneras (rätta mig om jag har fel) Null och inte 0... vill att det ska returneras 0 isåfall så tror jag att det ska fungera, som det är nu får jag inte fram något då tabell1.id < Null

Det är iafall vad jag tror är felet...

Om tabell2 är tom ==> ingen rad lever upp till villkoret T.id = S.id, så rimligtvis borde inte den jämförelsen spela någon roll.... väl? Eller evalueras båda uttrycken även vid "and"?

Ett sätt att komma ifrån problemet är ju att bara köra denna query om du har minst en rad i tabell2.

Om du använder "CREATE VIEW"-varianten istället kan du ju kolla att du har ett värde först. Och i annat fall använda en förenklad version av ovanstående där du plockar all relevant info från T utan att blanda in S alls.

133 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)