Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[SQL] Group om een union heen mogelijk?

Pagina: 1
Acties:

  • Guvner
  • Registratie: Oktober 2000
  • Laatst online: 05-04-2022
Ik ben druk bezig een heel lekkere query te bouwen, maar hij doet niet helemaal wat ik wil.


SQL: query
1
2
3
4
5
6
7
8
9
10
 
Select SUM(TotaalA), 0, PersID 
   FROM orders
GROUP BY PersID
Where PersSoort = '1'
UNION
Select 0, SUM(TotaalB), PersID 
   FROM orders
GROUP BY PersID
Where PersSoort = '2'


Hier komt het volgende resultaat uit


SQL: query
1
2
3
4
5
6
 
TotaalA   TotaalB      PersID
100            0          1
200            0          2
0              300        1
0              400        2


Nu had ik dus het idee om hier weer een totale group by omheen te gooien. Ik wil namelijk hier in dit geval 2 regels uit krijgen welke als volgt zijn:


SQL: gewenst resultaat
1
2
3
4
 
TotaalA   TotaalB      PersID
100            300          1
200            400          2



Heeft iemand voor mij de verslossende woorden? ben ondertussen al een uurtje of 7 bezig met deze query en heb half google gehad ondertussen.

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 18-11 20:06

Robtimus

me Robtimus no like you

Groupen op je union zoals jij het hebt kan niet. Wat wel kan, is de twee tabellen eerst unionen, dat een naam geven, en daar dan op joinen.

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT SUM(TotaalA), SUM(TotaalB), PersID
FROM
(
    SELECT TotaalA, 0 AS TotaalB, PersID
    FROM orders
    WHERE PersSoort = '1'
    UNION
    SELECT 0 AS TotaalA, TotaalB, PersID
    FROM orders
    WHERE PersSoort = '2'
) orders
GROUP BY PersID


Wat ook een optie is is maar 1 select, en dan een case statement in de sum:
SQL:
1
2
3
4
5
SELECT SUM(CASE WHEN PersSoort = '1' THEN TotaalA ELSE 0 END),
             SUM(CASE WHEN PersSoort = '2' THEN TotaalB ELSE 0 END), PersID
FROM orders
WHERE PersSoort IN ('1', '2')
GROUP BY PersID

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Wat heeft dit met DTE te maken? Waar hoort mijn topic?

DTE >> PRG

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Guvner
  • Registratie: Oktober 2000
  • Laatst online: 05-04-2022
Het lijkt inderdaad een erg goede oplossing. Ik heb geprobeerd hem in mijn query te verwerken. Het punt is alleen dat ik voor het voorbeeld hier een iets eenvoudigere versie van de query had gemaakt. Eigenlijk is hij als volgt:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT
   0,SUM(KingSystem.tabOrderKop.OrkTotaalExclBtw) AS TotaalEmail,KingSystem.tabRelatie.RelAchternaam AS RelAchternaam,KingSystem.tabVrCP003003.vrCP003003Veld43 AS PersNr
FROM
   KingSystem.tabRelatie,KingSystem.tabOrderKop,KingSystem.tabVrCP003003
WHERE
   ((KingSystem.tabOrderKop.OrkDatum >= '2008-05-15' AND KingSystem.tabOrderKop.OrkDatum <= '2008-05-20') AND KingSystem.tabVrCP003003.vrCP003003Veld42 = 'Email') AND (KingSystem.tabRelatie.RelGid = KingSystem.tabVrCP003003.vrCP003003RecordId AND KingSystem.tabOrderKop.OrkVtgCode = KingSystem.tabRelatie.RelVtgCode)
GROUP BY RelAchternaam, PersNr
UNION
SELECT
   SUM(KingSystem.tabOrderKop.OrkTotaalExclBtw) AS TotaalTelefoon,0,KingSystem.tabRelatie.RelAchternaam AS RelAchternaam,KingSystem.tabVrCP003003.vrCP003003Veld43 AS PersNr
FROM
   KingSystem.tabRelatie,KingSystem.tabOrderKop,KingSystem.tabVrCP003003
WHERE
   ((KingSystem.tabOrderKop.OrkDatum >= '2008-05-15' AND KingSystem.tabOrderKop.OrkDatum <= '2008-05-20') AND KingSystem.tabVrCP003003.vrCP003003Veld42 = 'Telefoon') AND (KingSystem.tabRelatie.RelGid = KingSystem.tabVrCP003003.vrCP003003RecordId AND KingSystem.tabOrderKop.OrkVtgCode = KingSystem.tabRelatie.RelVtgCode)
GROUP BY RelAchternaam, PersNr


En het punt is dus dat ik die eerste oplossing geprobeerd heb hier in te plaatsen. Hij accepteert echter niet de tabellen achter de laatste ) voor de group by lijkt het wel. Dit is wat ik er van heb gemaakt:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT SUM(TotaalEmail), SUM(TotaalTelefoon), RelAchternaam, PersNr
FROM
(
SELECT
   KingSystem.tabOrderKop.OrkTotaalExclBtw AS TotaalEmail,0,KingSystem.tabRelatie.RelAchternaam AS RelAchternaam,KingSystem.tabVrCP003003.vrCP003003Veld43 AS PersNr
FROM
   KingSystem.tabRelatie,KingSystem.tabOrderKop,KingSystem.tabVrCP003003
WHERE
   ((KingSystem.tabOrderKop.OrkDatum >= '2008-05-15' AND KingSystem.tabOrderKop.OrkDatum <= '2008-05-20') AND KingSystem.tabVrCP003003.vrCP003003Veld42 = 'Email') AND (KingSystem.tabRelatie.RelGid = KingSystem.tabVrCP003003.vrCP003003RecordId AND KingSystem.tabOrderKop.OrkVtgCode = KingSystem.tabRelatie.RelVtgCode)
GROUP BY RelAchternaam, PersNr
UNION
SELECT
   0,KingSystem.tabOrderKop.OrkTotaalExclBtw AS TotaalTelefoon,KingSystem.tabRelatie.RelAchternaam AS RelAchternaam,KingSystem.tabVrCP003003.vrCP003003Veld43 AS PersNr
FROM
   KingSystem.tabRelatie,KingSystem.tabOrderKop,KingSystem.tabVrCP003003
WHERE
   ((KingSystem.tabOrderKop.OrkDatum >= '2008-05-15' AND KingSystem.tabOrderKop.OrkDatum <= '2008-05-20') AND KingSystem.tabVrCP003003.vrCP003003Veld42 = 'Telefoon') AND (KingSystem.tabRelatie.RelGid = KingSystem.tabVrCP003003.vrCP003003RecordId AND KingSystem.tabOrderKop.OrkVtgCode = KingSystem.tabRelatie.RelVtgCode)
)KingSystem.tabRelatie,KingSystem.tabOrderKop,KingSystem.tabVrCP003003
GROUP BY RelAchternaam, PersNr

Hij zegt dan "Syntax error or access violation: near '.' in ...)KingSystem[.]tabRelatie..." De tabellen zijn juist en volgens mij de syntax ook.

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Ik weet niet wat voor dbms je gebruikt en of hij er over valt, maar volgens mij moeten alle aliassen bij een union in de bovenste query staan.

Who is John Galt?


  • Guvner
  • Registratie: Oktober 2000
  • Laatst online: 05-04-2022
Ik ben druk aan het puzzelen geweest met de geboden oplossingen. Uiteindelijk blijkt het een stuk lastiger te zijn dan ik dacht. In het voorbeeld wat ik in de eerste post heb gezet heb ik niet de juiste tabellen gegeven. Ik dacht het eenvoudiger uit te leggen was met het voorbeeld wat ik gaf. Maar de oplossingen die gegeven werden bleken een stuk lastiger te zijn met de uiteindelijk sql query die ik mee bezig was.

Het gaat uiteindelijk om een union tussen deze twee queries.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
 0,SUM(KingSystem.tabOrderKop.OrkTotaalExclBtw) AS TotaalEmail,KingSystem.tabVrCP003003.vrCP003003Veld43 AS PersNr
FROM
 KingSystem.tabRelatie,KingSystem.tabOrderKop,KingSystem.tabVrCP003003
WHERE
 ((KingSystem.tabOrderKop.OrkDatum >= '2008-05-15' AND KingSystem.tabOrderKop.OrkDatum <= '2008-05-20') AND KingSystem.tabVrCP003003.vrCP003003Veld42 = 'Email') AND (KingSystem.tabRelatie.RelGid = KingSystem.tabVrCP003003.vrCP003003RecordId AND KingSystem.tabOrderKop.OrkVtgCode = KingSystem.tabRelatie.RelVtgCode)
GROUP BY PersNr


SELECT
 SUM(KingSystem.tabOrderKop.OrkTotaalExclBtw) AS TotaalTelefoon,0,KingSystem.tabVrCP003003.vrCP003003Veld43 AS PersNr
FROM
 KingSystem.tabRelatie,KingSystem.tabOrderKop,KingSystem.tabVrCP003003
WHERE
 ((KingSystem.tabOrderKop.OrkDatum >= '2008-05-15' AND KingSystem.tabOrderKop.OrkDatum <= '2008-05-20') AND KingSystem.tabVrCP003003.vrCP003003Veld42 = 'Telefoon') AND (KingSystem.tabRelatie.RelGid = KingSystem.tabVrCP003003.vrCP003003RecordId AND KingSystem.tabOrderKop.OrkVtgCode = KingSystem.tabRelatie.RelVtgCode)
GROUP BY PersNr


Ze geven de volgende resultaten terug:
SQL:
1
2
3
4
5
6
7
TotaalEmail   TotaalTelefoon   PersNr
100               0             1
200               0             2

TotaalEmail   TotaalTelefoon   PersNr
0                 300           1
0                 400           2


Ik zou op deze queries een union willen maken die op PersNr gaat. Hiermee zou het dus dit resultaat worden:

SQL:
1
2
3
TotaalEmail   TotaalTelefoon   PersNr
100               300             1
200               400             2


Ik heb al geprobeerd om hier met een select een query omheen te bouwen en daarbij een union te gebruiken, maar helaas bleef ie een syntax error or access violation geven.

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 25-10 14:28
Probeer het eens in simpele stappen.

Eerst UNION ALL er tussen zetten en kijken of je resultaat krijgt.

Dan daar om heen nog eens SELECT samen.* FROM ( ... ) AS samen

Als je zover bent dan zal het sommeren en groeperen niet meer zo'n groot probleem zijn.

  • Guvner
  • Registratie: Oktober 2000
  • Laatst online: 05-04-2022
Dat dacht ik ook ja...

Maar helaas blijkt dat met die union all het inderdaad goed gaat. En dan die select er om heen begint gelijk te zeuren over een syntax error bij de laatste ). Zowel met AS ALLESSAMEN als zonder tekst er achter.

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Je hebt helemaal geen unions nodig, kijk eens naar aliassen.

Who is John Galt?


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 25-10 14:28
Misschien dat jouw database geen union ondersteunt in een afgeleide tabel? Ik zou me kunnen voorstellen dat MySQL zoeen beperking heeft.

p.s. Ik kijk nu even naar jouw queries, maar die hele union is niet nodig, als je de beperking op telefoon en e-mail uit de where haalt, of in ieder geval tussen die twee een OR zet.

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
idd, een union lijkt me echt nergens voor nodig... je selecteert uit dezelfde tabel en je onderscheidende criterium staat ook nog eens in hetzelfde veld... hoe beter wil je het hebben?

  • RSpliet
  • Registratie: Juni 2003
  • Laatst online: 08-09 21:45

RSpliet

*blink*

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT SUM(KingSystem.tabOrderKop.OrkTotaalExclBtw) AS TotaalEmail,KingSystem.tabVrCP003003.vrCP003003Veld43 AS PersNr
FROM KingSystem.tabRelatie,KingSystem.tabOrderKop,KingSystem.tabVrCP003003 AS `email`
JOIN (SELECT SUM(KingSystem.tabOrderKop.OrkTotaalExclBtw) AS TotaalTelefoon,KingSystem.tabVrCP003003.vrCP003003Veld43 AS PersNr
    FROM KingSystem.tabRelatie,KingSystem.tabOrderKop,KingSystem.tabVrCP003003
    WHERE ((KingSystem.tabOrderKop.OrkDatum >= '2008-05-15' AND
        KingSystem.tabOrderKop.OrkDatum <= '2008-05-20') AND
        KingSystem.tabVrCP003003.vrCP003003Veld42 = 'Telefoon') AND
        (KingSystem.tabRelatie.RelGid = KingSystem.tabVrCP003003.vrCP003003RecordId AND
        KingSystem.tabOrderKop.OrkVtgCode = KingSystem.tabRelatie.RelVtgCode)
    GROUP BY PersNr) AS `telefoon` ON `email`.`PersNr` = `telefoon`.PersNr`
WHERE ((KingSystem.tabOrderKop.OrkDatum >= '2008-05-15' AND
    KingSystem.tabOrderKop.OrkDatum <= '2008-05-20') AND 
    KingSystem.tabVrCP003003.vrCP003003Veld42 = 'Email') AND
    (KingSystem.tabRelatie.RelGid = KingSystem.tabVrCP003003.vrCP003003RecordId AND
    KingSystem.tabOrderKop.OrkVtgCode = KingSystem.tabRelatie.RelVtgCode)
GROUP BY PersNr


Join is volgens mij het juiste commando. Ik weet niet 100% zeker of deze werkt, maar de JOIN wordt naar mijn weten pas laat uitgevoerd (na de WHILE). Anders zal je op deze manier de 2 tabellen moeten joinen in een overkoepelende query, wordt t vast ook iets netter van O-)

[ Voor 12% gewijzigd door RSpliet op 23-05-2008 00:01 . Reden: Spaties ter leesbaarheid ]

Schaadt het niet, dan baat het niet


Verwijderd

Guvner schreef op donderdag 22 mei 2008 @ 22:28:
Ik zou op deze queries een union willen maken die op PersNr gaat. Hiermee zou het dus dit resultaat worden:

SQL:
1
2
3
TotaalEmail   TotaalTelefoon   PersNr
100               300             1
200               400             2
Da's niet zomaar met een union op te lossen, maar wel met het CASE voorbeeld dat IceManX gaf.

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
werkt dit niet? (kan het nu niet ff testen)

SQL:
1
2
3
select sum(if(veld='Email', veldnaam, 0)), sum(if(veld='Telefoon', veldnaam, 0)), persnr
from tabel
group by persnr


edit, hetzelfde als IceManX dus

[ Voor 8% gewijzigd door P.O. Box op 23-05-2008 00:05 ]

Pagina: 1