Zoek de juiste syntax voor UNION ALL select query

Status
Niet open voor verdere reacties.

leifoet

Gebruiker
Lid geworden
7 okt 2007
Berichten
326
sql = "SELECT veld1, veld2, veld3 FROM tabelA WHERE veld1=10
UNION ALL SELECT veld1, veld2, veld3 FROM tabelB WHERE veld1=10
ORDER BY veld1 ASC"
In mijn voorbeeld werkt bovenstaande query; onderstaande niet naar behoren (2x resultaat in plaats van 1x).

sql = "SELECT sum(veld2) as TOTveld2, count(veld3) as TELveld3 FROM tabelA WHERE veld1=10
UNION ALL SELECT sum(veld2) as TOTveld2, count(veld3) as TELveld3 FROM tabelB WHERE veld1=10"
Vermoedelijk is de syntax hiervan niet OK.

Graag een tip
 
Het laatste voorbeeld in de opgegeven URL van edmoor is schijnbaar gelijklopend.
Toch worden met de SELECT Query (cfr. mijn eerste bericht) de resultaten van de 2 tabellen afzonderlijk weergegeven, dus (TOTveld2 en TELveld3) voor tabelA en nogmaals hetzelfde (weliswaar met de toepasselijke cijfers) voor tabelB
Met UNION ALL verwacht ik één totaalbedrag (TOTveld2) voor tabelA én B samen en één optelling (TELveld3) eveneens van de 2 tabellen samen.

Waar zit de syntaxisfout ?
 
Als je 1 totaalbedrag wilt zul je een aparte query moeten maken waarin je de resultaten van de UNION totaliseert.

Tardis
 
Zoiets? Geeft één regel als resultaat.
PHP:
sql = "SELECT veld1
       ,      sum(veld2)   as TOTveld2
       ,      count(veld3) as TELveld3
       FROM ( SELECT veld1, veld2, veld3 FROM tabelA WHERE veld1=10
              UNION ALL
              SELECT veld1, veld2, veld3 FROM tabelB WHERE veld1=10
            )
       GROUP BY veld1"
 
Ik probeerde de query uit te breiden met een bijkomende 'vertakking' … en loop weer vast.

Stel dat ik hieronder bijvoorbeeld toevoeg : sum(TOTveld2) as GLOBTOT - hoe 'verwijs' ik (met FROM en UNION ALL) dan -zonder error- naar de oorspronkelijke velden ?

sql = "SELECT veld1
, sum(veld2) as TOTveld2
, sum (TOTveld2) as GLOBTOT
, count(veld3) as TELveld3
FROM ( SELECT veld1, veld2, veld3 FROM tabelA WHERE veld1=10
UNION ALL
SELECT veld1, veld2, veld3 FROM tabelB WHERE veld1=10
)
GROUP BY veld1"
 
Laatst bewerkt:
Je kunt alleen verwijzen naar de velden in de subquery, dus die je in deze query hebt staan:
[sql]SELECT veld1, veld2, veld3 FROM tabelA WHERE veld1=10
UNION ALL
SELECT veld1, veld2, veld3 FROM tabelB WHERE veld1=10[/sql]

Nu probeer je bij GLOBTOT een veld te gebruiken dat op het zelfde niveau wordt geselecteerd en je gebruikt daarbij de alias je het oorspronkelijke veld moet gebruiken. Je zou dan in dit voorbeeld niet dit:
[sql], sum (TOTveld2) as GLOBTOT[/sql]
Maar dit moeten gebruiken:
[sql], sum (sum(veld2)) as GLOBTOT[/sql]
Echter, wat je dan misschien al wel opvalt is dat je dan 2 keer sum() gebruikt, dat voegt niet veel toe. Immers sum(1+2) = 3 en sum(sum(1+2)) is nog steeds 3. Dus hoe de query er uit moet komen te zien hangt af wat je hoopt te bereiken, dat kan ik uit het voorbeeld niet opmaken.
 
sum (sum(veld2)) AS GLOBTOT geeft error

Query herschreven - geeft volgende error :
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver] You tried to execute a query that does not include the specified expression 'Datum' as part of an aggregate function.
Wat wordt hiermee bedoeld ?

sql = "SELECT Datum, Aantal, Omschrijving, BUit, BIn, Sum(BUit) AS SomUIT, Sum(BIn) AS SomIN
FROM (SELECT Datum, Aantal, Omschrijving, BUit, BIn FROM tabelA WHERE LId=Mem
UNION ALL SELECT Datum, Aantal, Omschrijving, BUit, BIn FROM tabelB WHERE LId=Mem)
ORDER BY Datum"
 
Geprobeerd om query verder bij te werken met GROUP BY als volgt

sql = "SELECT Datum, Aantal, Omschrijving, BUit, BIn, Sum(BUit) AS SomUIT, Sum(BIn) AS SomIN
FROM (SELECT Datum, Aantal, Omschrijving, BUit, BIn FROM tabelA WHERE LId=Mem
UNION ALL SELECT Datum, Aantal, Omschrijving, BUit, BIn FROM tabelB WHERE LId=Mem)
GROUP BY Datum, Aantal, Omschrijving, BUit, BIn
ORDER BY Datum"
Krijg nu deze error :
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'
[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.

Voor zover mij bekend zou dit kunnen wijzen op een typefout.
Heb alles (driedubbel) nagezien en niets abnormaals ontdekt.

Toch nog een syntaxisfout ?
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan