Avatar billede svinget Praktikant
25. oktober 2006 - 08:58 Der 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:

(buy1v)tabel 1 - (buy1a)tabel 2
(buy2v)tabel 1 - (buy2a)tabel 2
(buy3v)tabel 1 - (buy3a)tabel 2

Mvh. Kim
Avatar billede fdata Forsker
25. oktober 2006 - 19:42 #1
1. Kunne du ikke bare sætte et minus:

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
);
Avatar billede svinget Praktikant
25. oktober 2006 - 20:26 #2
yes, det virker ved at sætte minus foran :)

Jeg begynder at kunne se logikken når du "eksploderer" udtrykket, men hvordan får jeg det til at blive noget SQL som access godtager?
Avatar billede fdata Forsker
25. oktober 2006 - 22:54 #3
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.
Avatar billede kjulius Novice
26. oktober 2006 - 02:05 #4
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
);
Avatar billede fdata Forsker
26. oktober 2006 - 22:56 #5
kjulius >> Du har fuldstændig ret. Kopieringen af linier gik vist lidt for hurtigt.
Avatar billede svinget Praktikant
27. oktober 2006 - 13:03 #6
Det virker perfekt. Tak for hjælpen begge to :)
kjulius: poster du også et svar?
Avatar billede svinget Praktikant
27. oktober 2006 - 21:46 #7
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).

/Kim
Avatar billede kjulius Novice
28. oktober 2006 - 22:14 #8
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.
Avatar billede svinget Praktikant
31. oktober 2006 - 20:24 #9
Tak for hjælpen :)
Avatar billede fdata Forsker
31. oktober 2006 - 22:04 #10
Takker for point  ;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester