25. oktober 2006 - 08:58Der er
8 kommentarer og 2 løsninger
Trække summen af 2 tabeller fra hinanden
Hej
Jeg har fået god hjælp til at lægge summen at 2 tabeller fra hinanden. SELECT Sum([Sammenlagt]) AS Ialt From (SELECT Sum([buy1v]) AS Sammenlagt FROM Table1 UNION SELECT Sum([buy1a]) AS Sammenlagt FROM Table2);
Jeg har brug for hjælp til 2 ændringer: 1. Nu har jeg brug for at trække summen af kolonnen (buy1v)tabel 1 fra summen kolonnen (buy1a)tabel 2 i stedet for at lægge dem sammen.
2. Hvordan kan jeg gøre det ovenstående på flere kolonner i samme tabeller:
SELECT Sum([Sammenlagt]) AS Ialt From (SELECT Sum([buy1v]) AS Sammenlagt FROM Table1 UNION SELECT -Sum([buy1a]) AS Sammenlagt FROM Table2);
I øvrigt: Du skriver "summen af kolonnen (buy1v)tabel 1 fra summen kolonnen (buy1a)tabel 2" men eksemplet viser det modsatte
2. Det er måske lettest at se, hvis vi eksploderer udtrykket:
SELECT Sum([Sammenlagt1]) AS Ialt1, Sum([Sammenlagt2]) AS Ialt2, Sum([Sammenlagt3]) AS Ialt3 From (SELECT Sum([buy1v]) AS Sammenlagt1 FROM Table1, Sum([buy2v]) AS Sammenlagt2 FROM Table1, Sum([buy3v]) AS Sammenlagt3 FROM Table1 UNION SELECT -Sum([buy1a]) AS Sammenlagt1 FROM Table2, -Sum([buy2a]) AS Sammenlagt2 FROM Table2, -Sum([buy3a]) AS Sammenlagt3 FROM Table2 );
Helt enkelt. Du opretter en forespørgsel, vælger ikke at tilføje tabeller og klikker ok. Nu kan du klikke på SQL knappen og paste udtrykket ind. Du kan ikke se forespørgslen i designvisning (det er jo en Union, det ville give en underlig grafisk repræsentation); men du kan rette i SQL udtrykket og fyre den af og gemme den på normal vis. Når du har gemt den, ser du det specielle Union ikon til venstre for forespørgselsnavnet.
Du bør dog bruge UNION ALL i stedet for bare UNION, da du ellers vil kunne risikere at én af dine rækker bliver "frasorteret". Det vil ske, hvis summeringen af Table1 resulterer i nøjagtig de samme tal som summeringen fra Table2. Om det vil kunne ske med dine tal, ved jeg selvsagt ikke, men for en sikkerheds skyld, bør du ændre det.
I øvrigt kan jeg ikke helt se formålet med at lave en dobbelt opsummering (og da slet ikke de mange FROM sætninger :-}). Du burde få det samme resultat med
SELECT Sum([buy1]) AS Ialt1, Sum([buy2]) AS Ialt2, Sum([buy3]) AS Ialt3 From ( SELECT [buy1v] AS buy1, [buy2v] AS buy2, [buy3v] AS buy3 FROM Table1 UNION ALL SELECT -[buy1a] AS buy1, -[buy2a] AS buy2, -[buy3a] AS buy3 FROM Table2 );
Jeg et problem. Hvis jeg bruger denne sql får jeg en fejl: SELECT Sum([buy1]) AS Ialt1, Sum([buy2]) AS Ialt2, Sum([buy3]) AS Ialt3, Sum([buy4]) AS Ialt4, Sum([buy5]) AS Ialt5, Sum([buy6]) AS Ialt6, Sum([buy7]) AS Ialt7 Sum([buy8]) AS Ialt8 From ( SELECT [ea1] AS buy1, [ea2] AS buy2, [ea3] AS buy3, [ea4] AS buy4, [ea5] AS buy5, [ea6] AS buy6, [ea7] AS buy7, [ea8] AS buy8 FROM storage UNION ALL SELECT -[ea1] AS buy1, -[ea2] AS buy2, -[ea3] AS buy3, -[ea4] AS buy4, -[ea5] AS buy5, -[ea6] AS buy6, -[ea7] AS buy7, -[ea8] AS buy8 FROM orders );
Fejlen er: SELECT sætningen indeholder et reserveret ord eller argument, der er stavet forkert eller mangler, eller tegnsætningen er ikke korrekt.
Men hvis jeg fjerne et af sum tallene, så virker det fint. Det er som om den ikke kan håndtere alle 8 (ea1 til ea8).
Jeg tror det er fordi, du mangler et komma efter Ialt7 i den første select.
Iøvrigt (ikke at det betyder noget, men det gør det jo lidt lettere): Da feltnavnene er de samme i begge tabeller i UNION sætningen, er der ingen grund til at omdøbe dem. Du kan bare skrive:
SELECT Sum([ea1]) AS Ialt1, Sum([ea2]) AS Ialt2, Sum([ea3]) AS Ialt3, Sum([ea4]) AS Ialt4, Sum([ea5]) AS Ialt5, Sum([ea6]) AS Ialt6, Sum([ea7]) AS Ialt7, Sum([ea8]) AS Ialt8 From ( SELECT [ea1], [ea2], [ea3], [ea4], [ea5], [ea6], [ea7], [ea8] FROM storage UNION ALL SELECT -[ea1], -[ea2], -[ea3], -[ea4], -[ea5], -[ea6], -[ea7], -[ea8] FROM orders );
Ja, faktisk bliver det endnu bedre (eller værre, hvis man er logisk anlagt), for faktisk behøver man aldrig lave en rename på felter i en UNION, da den samlede UNION altid vil antage feltnavne fra den første del af en UNION. Men det bliver da måske lidt mere overskueligt hvis felterne angives til de samme navne.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.