[SQL] 2 counts over een union

Pagina: 1
Acties:

  • Tweak-a-holic
  • Registratie: December 2002
  • Laatst online: 08-03-2023
Ik ben nu al even aan het puzzelen maar zie waarschijnlijk iets over het hoofd. Ik heb een tabel die er als volgt uitziet:

ID | naam_1 | aantal_1 | naam_2 | aantal_2
1 | a | 1 | a | 1
2 | b | 1 | b | 5
3 | a | 3 | c | 2

IDnaam_1aantal_1naam_2aantal_2
1a1a1
2b1b5
3a3c2


Nu wil ik de opgetelde aantallen hebben van A, B en C.

Ik heb dit al geprobeerd door middel van een Union, maar krijg de sum niet ingevoegd op deze manier.

code:
1
2
3
4
5
SELECT Naam1 
FROM tabel
UNION
SELECT Naam2 
FROM tabel


Dan heb ik ABC op een rij staan, nu wil ik alleen ook nog de opgetelde aantalllen. De uitkomst zou dus moeten zijn:

A | 5
B | 6
C | 2

I just wanna make fake love to you...


  • riZZy
  • Registratie: Februari 2004
  • Laatst online: 10:50
code:
1
2
3
4
5
6
7
8
9
SELECT naam, sum(aantal)
FROM
(SELECT Naam1 as naam, Aantal1 as aantal
FROM tabel
UNION
SELECT Naam2 as naam, Aantal2 as aantal
FROM tabel)
GROUP BY naam
ORDER BY naam


Als je overigens zelf hebt gekozen voor deze tabelstructuur, dan zou je eens wat moeten lezen over normaliseren. :)

edit: group by statement toegevoegd.

[ Voor 13% gewijzigd door riZZy op 15-08-2006 10:48 ]


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

riZZy schreef op dinsdag 15 augustus 2006 @ 08:10:
SELECT naam, sum(aantal)
FROM
(SELECT Naam1 as naam, Aantal1 as aantal
FROM tabel
UNION
SELECT Naam2 as naam, Aantal2 as aantal
FROM tabel)

Als je overigens zelf hebt gekozen voor deze tabelstructuur, dan zou je eens wat moeten lezen over normaliseren. :)
Deze oplossing is wel afhankelijk van je gekozen dbms...
Subselects zijn al wel redelijk ondersteund, maar nog niet overal. (lees MySQL 4)

Fat Pizza's pizza, they are big and they are cheezy


  • riZZy
  • Registratie: Februari 2004
  • Laatst online: 10:50
Zijn er dan ook oplossingen die dbms-onafhankelijk werken?

(zelf werk ik met oracle, meen dat het daarbij wel werkt)

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

riZZy schreef op dinsdag 15 augustus 2006 @ 08:29:
Zijn er dan ook oplossingen die dbms-onafhankelijk werken?

(zelf werk ik met oracle, meen dat het daarbij wel werkt)
Ehm, normaliseren is idd een optie. Dan is de query een stuk simpeler.

Fat Pizza's pizza, they are big and they are cheezy


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09:21

Janoz

Moderator Devschuur®

!litemod

Als je de waarden in de kolom aantal op wilt tellen kun je beter SUM ipv COUNT gebruiken. Klein gokje. Gaat het hier over doelsaldo's?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Tweak-a-holic
  • Registratie: December 2002
  • Laatst online: 08-03-2023
Ik heb de database niet zelf gemaakt, maar de gegevens van naam1 en naam2 horen bij elkaar het gaat om een record waarin een order word aangemaakt waar een linker en een rechter product bij hoort.

Ik zou het zelf ook anders gedaan, maar ja.
SELECT naam, sum(aantal)
FROM
(SELECT Naam1 as naam, Aantal1 as aantal
FROM tabel
UNION
SELECT Naam2 as naam, Aantal2 as aantal
FROM tabel)
Heb dit geprobeerd maar ik gebruik idd nog een versie 4.nogwat van MySQL, dus dat ging niet goed. Is er een andere oplossing hiervoor?

[ Voor 38% gewijzigd door Tweak-a-holic op 15-08-2006 10:21 ]

I just wanna make fake love to you...


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
De vraag is nu, kun je werken met subselects of niet? Als dat niet zo is, heb je dan wel een tabel met alle producten erin?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Tweak-a-holic
  • Registratie: December 2002
  • Laatst online: 08-03-2023
P_de_B schreef op dinsdag 15 augustus 2006 @ 10:15:
De vraag is nu, kun je werken met subselects of niet? Als dat niet zo is, heb je dan wel een tabel met alle producten erin?
Geen subselects dus, heb wel een tabel met producten maar daarin staan alleen de producten die we op dit moment leveren (veranderd nog wel eens). Dus dat kan niet.

Word dan waarschijnlijk gewoon alle producten ophalen door de union selects, en daarna daar doorheen loop-en en aantallen optellen? Zou mooier zijn met enke SQL command.

I just wanna make fake love to you...


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Tweak-a-holic schreef op dinsdag 15 augustus 2006 @ 10:12:
Heb dit geprobeerd maar ik gebruik idd nog een versie 4.nogwat van MySQL, dus dat ging niet goed. Is er een andere oplossing hiervoor?
Die query is niet helemaal correct... dus dat het "niet goed ging" zegt nog niks. Vanaf MySQL 4.1 kan je al subqueries gebruiken, maar dan moet je natuurlijk wel een correcte query er aan geven. In dit geval eentje waarbij een aggregate-functie niet zonder een group-by-clause wordt gecombineerd met een gewone colum.

  • riZZy
  • Registratie: Februari 2004
  • Laatst online: 10:50
Als je ook schrijfrechten hebt (en genoeg ruimte) dan kun je de subquery natuurlijk wegschrijven als tabel en vervolgens de tweede selectie doen.

Ligt eraan of het een adhoc vraag is of je het vaak moet doen....

  • riZZy
  • Registratie: Februari 2004
  • Laatst online: 10:50
ACM schreef op dinsdag 15 augustus 2006 @ 10:36:
[...]

Die query is niet helemaal correct... dus dat het "niet goed ging" zegt nog niks. Vanaf MySQL 4.1 kan je al subqueries gebruiken, maar dan moet je natuurlijk wel een correcte query er aan geven. In dit geval eentje waarbij een aggregate-functie niet zonder een group-by-clause wordt gecombineerd met een gewone colum.
Inderdaad, was de group by vergeten... 8)7

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

riZZy schreef op dinsdag 15 augustus 2006 @ 10:37:
Als je ook schrijfrechten hebt (en genoeg ruimte) dan kun je de subquery natuurlijk wegschrijven als tabel en vervolgens de tweede selectie doen.
Sterker nog, dat zou MySQL misschien toch al doen. En aangezien elke MySQL vanaf 4.0 de union-clause kent kan het idd met een (temporary) table van je resultaten en die dan verder groeperen.
Ligt eraan of het een adhoc vraag is of je het vaak moet doen....
Je doelt op de performance? Zo zwaar is het niet om een nieuwe tabel in MySQL te creeeren, dus dat maakt niet zoveel uit gok ik.

  • riZZy
  • Registratie: Februari 2004
  • Laatst online: 10:50
ACM schreef op dinsdag 15 augustus 2006 @ 10:39:
Je doelt op de performance? Zo zwaar is het niet om een nieuwe tabel in MySQL te creeeren, dus dat maakt niet zoveel uit gok ik.
Ik doelde meer op het automatiseren van het geheel. Zelf heb ik niet de mogelijkheid (of de kennis :) ) om automatisch tabellen te creeren, de volgende query te doen en dan de tabel weer te deleten. Dus voor eenmalig gebruik zou ik dat wel doen, maar als ik het geheel zou moeten automatiseren, dan weet ik niet hoe ik dat zou moeten aanpakken. (Dat hangt waarschijnlijk ook heel erg af van je dbms?!)

  • Tweak-a-holic
  • Registratie: December 2002
  • Laatst online: 08-03-2023
Krijg de foutmelding: #1248 - Every derived table must have its own alias. Als ik deze Query draai (met of zonder group by:

code:
1
2
3
4
5
6
7
8
9
SELECT naam, sum( aantal )
FROM (
SELECT Naam1 AS naam, Aantal1 AS Aantal
FROM tabel
UNION
SELECT Naam2 AS naam, Aantal2 AS Aantal
FROM tabel
)
GROUP BY Aantal

[ Voor 3% gewijzigd door Tweak-a-holic op 15-08-2006 10:44 ]

I just wanna make fake love to you...


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Tweak-a-holic schreef op dinsdag 15 augustus 2006 @ 10:44:
Krijg de foutmelding: #1248 - Every derived table must have its own alias. Als ik deze Query draai (met of zonder group by:

code:
1
2
3
4
5
6
7
8
9
SELECT naam, sum( aantal )
FROM (
SELECT Naam1 AS naam, Aantal1 AS Aantal
FROM web_order
UNION
SELECT Naam2 AS naam, Aantal2 AS Aantal
FROM web_order
)EenAlias
GROUP BY Aantal
;)

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Tweak-a-holic
  • Registratie: December 2002
  • Laatst online: 08-03-2023
Op deze manier is het gelukt (was idd alias vergeten nog niet helemaal wakker ;) )

code:
1
2
3
4
5
SELECT naam, sum(Aantal) as totaal FROM 
(SELECT Naam1 as naam, Aantal1 as Aantal FROM tabel
UNION ALL
SELECT Naam2 as naam, Aantal2 as Aantal FROM tabel) 
as Naam Group By naam ORDER BY totaal DESC

I just wanna make fake love to you...

Pagina: 1