GROUP BY , SUM, FREQUENTIE

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Senior, Medior and Junior SAP HANA Developer

Vacature details Vakgebied: Software/IT Opleiding: Medior Werklocatie: Veldhoven Vacature ID: 12696 Introductie Our client is the world's leading provider of lithography systems for the semiconductor industry, manufacturing complex machines that are critical to the production of integrated circuits or chips. Our purpose is “unlocking the potential of people and society by pushing technology to new limits”. We do this guided by the principles “Challenge”, “Collaborate” and “Care”. Wat verwachten we van jou? SAP Certified Application Associate - SAP HANA Cloud Modeling (training and/or certification) Bachelor degree or higher Excellent understanding of SAP HANA (2.0 / Cloud), Data Modelling and writing

Bekijk vacature »

Pagina: 1 2 volgende »

Femke

femke

29/01/2007 20:02:00
Quote Anchor link
ik heb de volgende kolom

merk
-------------
nokia
samsung
nokia
sony
sony
samsung
nokia
samsung
lg
lg

nu wil ik het volgende:

het aantal keer dat een merk voorkomt berekenen, gaat met
SELECT merk,count(merk) FROM `re_monograms` GROUP BY merk

nu wil ik deze frequenties weer optellen, zodat ik aan een totaal aantal kom, ik zou verwachten dat dit gaat met

SELECT sum(count(merk)) FROM `re_monograms` GROUP BY merk

maar helaas niet, hoe tel ik de frequentie resultaten op?

een stap verder is weer dat ik dus de relatieve frequentie wil bereken, dus het aantal keer dat bijvoorbeeld nokia voorkomt, dat zou ik dit geval dus 0,3 moeten opleveren, hoe doe ik dat?
Gewijzigd op 01/01/1970 01:00:00 door Femke
 
PHP hulp

PHP hulp

19/11/2024 23:24:05
 
Frank -

Frank -

29/01/2007 20:15:00
Quote Anchor link
Dit kan onmogelijk in 1 query: het merk, het totaal per merk en het totaal aantal records zijn dermate verschillende gegevens dat je dit niet in 1x kunt ophalen. Dit moet met 2 queries:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT
  merk,
  COUNT(merk) AS aantal
FROM
  re_monograms
GROUP BY
  merk

En
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT
  COUNT(merk) AS aantal
FROM
  re_monograms

Ga je eens verdiepen in het gebruik van GROUP BY, dan snap je zelf ook waarom je dit niet in 1 query kunt oplossen.
 
Joren de Wit

Joren de Wit

29/01/2007 20:21:00
Quote Anchor link
Frank, het is wel degelijk mogelijk om dit binnen 1 query te houden. Het is mogelijk om eerst 'subtotalen' weer te geven en vervolgens een totaal bestaande uit de som van de subtotalen weer te geven:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
SELECT
    merk,
    COUNT(merk) AS aantal
FROM
    re_monograms
GROUP BY
    merk
WITH ROLLUP

Het enige waar je wel een aparte query voor nodig hebt is in dit geval de relatieve frequentie.

ps. Referentie naar de MySQL handleiding: http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Klaasjan Boven

Klaasjan Boven

29/01/2007 21:42:00
Quote Anchor link
Leuk dat ROLLUP had ik nog nooit van gehoord
 
Jan Koehoorn

Jan Koehoorn

29/01/2007 21:45:00
Quote Anchor link
@ Blanche: binnen je SELECT heb je toch alleen maar de veldnaam merk en de alias aantal? En wat je wilt is een merk, een aantal subtotalen en een totaal. Hoe moeten die dan uit die ene query rollen?
Edit:
Ik lees op de website van MySQL dat er extra rijen met een NULL value voor de merknaam toegevoegd worden, waarin de running totals geplaatst worden.
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
 
Frank -

Frank -

29/01/2007 21:50:00
Quote Anchor link
Hmmmm, kende ROLLUP niet, aardige tip.

Ik weet alleen niet of het wel een goed plan is om deze te gebruiken, ik zou hem eerst eens uitgebreid gaan testen.

Eén van de voorbeelden op de site:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT year, country, product, SUM(profit)
    -> FROM sales
    -> GROUP BY year, country, product WITH ROLLUP
    -> LIMIT 5;
+------+---------+------------+-------------+
| year | country | product    | SUM(profit) |
+------+---------+------------+-------------+
| 2000 | Finland | Computer   |        1500 |
| 2000 | Finland | Phone      |         100 |
| 2000 | Finland | NULL       |        1600 |
| 2000 | India   | Calculator |         150 |
| 2000 | India   | Computer   |        1200 |
+------+---------+------------+-------------+
laat namelijk al zien dat er onvolledige data als output wordt aangeleverd. In dit geval is het gek dat Finland wel een totaal oplevert, maar India niet. Tevens staan er nu 2 soorten data doorelkaar: Het totaal per product per land en het totaal aantal producten per land. Waar dus 1 totaal van ontbreekt. Je mag nu met PHP aan de slag om het ontbrekende gegeven op te sporen, India in dit geval.

Ben ook benieuwd wat ORDER BY voor resultaten gaat opleveren. Ik voorzie in elk geval problemen met de presentatie wanneer de gegevens doorelkaar staan.
 
Jan Koehoorn

Jan Koehoorn

29/01/2007 21:54:00
Quote Anchor link
@ Frank: dat zal hem in dit geval in die LIMIT 5 zitten, maar feit blijft dat er verschillende typen data door elkaar staan en je dus met PHP zult moeten kijken wat wat is.
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
 
Frank -

Frank -

29/01/2007 22:00:00
Quote Anchor link
@Jan: Mee eens, ik verwacht ook dat dit komt door de LIMIT. Het is alleen gek dat hierdoor een deel van de relevante data kwijtraakt. Omdat je teveel verschillende soorten producten per land hebt, raak je door de LIMIT het totaal van 1 land (onbekend welk land) kwijt! Dit mag nooit voorkomen imho.

Het is zelfs zo, dat het totaal van Finland hiermee ook waardeloos wordt, je hebt niks om mee te vergelijken.

Kortom, je wilt zowel het totaal per product opvragen als het totaal per land, maar het totaal per land krijg je alleen wanneer er niet te veel producten in de lijst staan. Die is lekker, dan weet je dus nooit zeker wat je terug gaat krijgen.

Kortom, gebruik 2 queries, deze functie is niet te vertrouwen. Met 2 queries weet je precies wat je terug gaat krijgen, ook als je een LIMIT gebruikt of gaat sorteren.
 
Klaasjan Boven

Klaasjan Boven

29/01/2007 22:02:00
Quote Anchor link
TOch heb ik de indruk dat dit (met name de laatste drie rijen) ook willekeurige output is
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mysql> SELECT year, country, product, SUM(profit)
    -> FROM sales
    -> GROUP BY year, country, product WITH ROLLUP;
+------+---------+------------+-------------+
| year | country | product    | SUM(profit) |
+------+---------+------------+-------------+
| 2000 | Finland | Computer   |        1500 |
| 2000 | Finland | Phone      |         100 |
| 2000 | Finland | NULL       |        1600 |
| 2000 | India   | Calculator |         150 |
| 2000 | India   | Computer   |        1200 |
| 2000 | India   | NULL       |        1350 |
| 2000 | USA     | Calculator |          75 |
| 2000 | USA     | Computer   |        1500 |
| 2000 | USA     | NULL       |        1575 |
| 2000 | NULL    | NULL       |        4525 |
| 2001 | Finland | Phone      |          10 |
| 2001 | Finland | NULL       |          10 |
| 2001 | USA     | Calculator |          50 |
| 2001 | USA     | Computer   |        2700 |
| 2001 | USA     | TV         |         250 |
| 2001 | USA     | NULL       |        3000 |
| 2001 | NULL    | NULL       |        3010 |
| NULL | NULL    | NULL       |        7535 |
+------+---------+------------+-------------+


Volgens mij moet je er du erg voorzichtig mee zijn
 
Jan Koehoorn

Jan Koehoorn

29/01/2007 22:03:00
Quote Anchor link
Mee eens, deze resultaten zijn onvoorspelbaar.
 
Klaasjan Boven

Klaasjan Boven

29/01/2007 22:06:00
Quote Anchor link
Bij nader inzien valt het toch nog mee. Ergens halverwege geeft hij de(SUM) voor FINLAND (en de rest staat er ook wel in alleen niet allemaal onderaan)

Dus ik zie toch wel voordelen
 
Jan Koehoorn

Jan Koehoorn

29/01/2007 22:09:00
Quote Anchor link
Kun je het zo stellen dat geldige subtotalen in dit voorbeeld een NOT NULL waarde hebben in het veld country en een NULL waarde in het veld product? Dan zou je er namelijk nog wel iets aan kunnen hebben, als je geen LIMIT gebruikt.
 
Klaasjan Boven

Klaasjan Boven

29/01/2007 22:12:00
Quote Anchor link
Grotendeels mee eens. Volgens mij kan je ook de waarden gebruiken die een NULL hebben in produkt en in country Dat zijn imo de SUMS per jaar

en inderdaad geen LIMIT
 
Jan Koehoorn

Jan Koehoorn

29/01/2007 22:14:00
Quote Anchor link
De vraag blijft dan natuurlijk of je extra PHP code opweegt tegen 1 MySQL query versus 2. Over het algemeen vind ik het wel prettig als een query eenduidige resultaten oplevert.
 
Frank -

Frank -

29/01/2007 22:15:00
Quote Anchor link
@Klaasjan: Klopt, maar waarom verdwijnt er relevante data (het totaal van India) wanneer je LIMIT gebruikt?

Er staan verschillende soort data doorelkaar waardoor je dit probleem krijgt. Wederom een probleem met de GROUP BY van MySQL.

Het lijkt leuk, maar de output is afhankelijk van de gegevens die jij al hebt. Jij moet bv. al weten dat Finland en India ieder 2 records met producten hebben en ieder nog 1 record met het totaal heeft (per land dus 3 records). Wanneer je er dan voor zorgt dat je LIMIT 6 gebruikt (2x3), krijg je de juiste data retour. Dit slaat toch nergens op, of wel dan?

Query: Per land per product wil ik het totaal weten en per land het overall totaal. Beperk de resultaten tot 5 records. Welke gegevens ga jij dan retour krijgen? Dat weet je dus niet, gelukkig heeft MySQL wel weer een fijne verrassing voor jou in petto...

Met 2 aparte queries weet je precies welke resultaten, welke data, jij retour krijgt. De totalen per land per product, of het totaal per land. En dat kun je prima met een LIMIT aanpakken.
 
Klaasjan Boven

Klaasjan Boven

29/01/2007 22:18:00
Quote Anchor link
@Frank
Het blijft zoals jij ooit zei "het debiele broertje :)'
 
Frank -

Frank -

30/01/2007 00:22:00
Quote Anchor link
Nu ik dit nog eens doorlees, de query ik hier benoem kan 6 verschillende resultaten opleveren:
1) 1 record met product van land A, het totaal van land A, 1 record met product van land B, het totaal van land B en 1 record met product van land C. totaal van land C ontbreekt. (fout)
2) 2 records met producten van land A, het totaal van land A, 2 records met product van land B, het totaal van land B ontbreekt. (fout)
3) 2 records met producten van land A, het totaal van land A, 1 record met product van land B en het totaal van land B. (goed)
4) 3 records met producten van land A, het totaal van land A, 1 record met product van land B, het totaal van land B ontbreekt (fout)
5) 4 records met producten van land A en het totaal van land A (goed)
6) 5 records met producten van land A, totaal ontbreekt (fout)

Zoals je kunt zien, levert deze query in slechts 2 van de 6 gevallen een correct (lees: volledig) resultaat op. In de andere gevallen ontbreken er gegevens en je kunt er slechts naar raden wát er ontbreekt.

Ik vraag me toch werkelijk af wat het doel van MySQL is met dit soort belabberde toepassingen.

Maar goed, PostgreSQL kost niets en is vele malen handiger in het gebruik. ;)
Gewijzigd op 01/01/1970 01:00:00 door Frank -
 
Joren de Wit

Joren de Wit

30/01/2007 11:36:00
Quote Anchor link
Inderdaad, deze functie levert een gecompliceerd resultaat op als je gaat groeperen op meerdere kolommen. En in zo'n geval zou ik het zelf ook niet gebruiken.

Het enige leuke waar deze functie van pas zou komen is als je groepeert op 1 kolom. Je weet dan namelijk altijd zeker dat het laatste record uit je result set de running total van alle voorgaande records bevat.

Maar Frank, ik ben het helemaal met je eens dat het niet netjes is dat er onvolledige resultaten weergegeven worden. En zoals je zelf ook al aandraagt gaat dit voor problemen zorgen zodra je groepeert op meerdere kolommen. Een uitgebreide inspectie van de resultaten met php is dan nodig om erachter te komen welke waarde wat voorstelt en dat weegt niet op tegen de extra code voor een tweede query.
 
Robert Deiman

Robert Deiman

30/01/2007 12:14:00
Quote Anchor link
Klaasjan Boven schreef op 29.01.2007 22:02:
TOch heb ik de indruk dat dit (met name de laatste drie rijen) ook willekeurige output is
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mysql> SELECT year, country, product, SUM(profit)
    -> FROM sales
    -> GROUP BY year, country, product WITH ROLLUP;
+------+---------+------------+-------------+
| year | country | product    | SUM(profit) |
+------+---------+------------+-------------+
| 2000 | Finland | Computer   |        1500 |
| 2000 | Finland | Phone      |         100 |
| 2000 | Finland | NULL       |        1600 |
| 2000 | India   | Calculator |         150 |
| 2000 | India   | Computer   |        1200 |
| 2000 | India   | NULL       |        1350 |
| 2000 | USA     | Calculator |          75 |
| 2000 | USA     | Computer   |        1500 |
| 2000 | USA     | NULL       |        1575 |
| 2000 | NULL    | NULL       |        4525 |
| 2001 | Finland | Phone      |          10 |
| 2001 | Finland | NULL       |          10 |
| 2001 | USA     | Calculator |          50 |
| 2001 | USA     | Computer   |        2700 |
| 2001 | USA     | TV         |         250 |
| 2001 | USA     | NULL       |        3000 |
| 2001 | NULL    | NULL       |        3010 |
| NULL | NULL    | NULL       |        7535 |
+------+---------+------------+-------------+


Volgens mij moet je er du erg voorzichtig mee zijn


De laatste records zijn ook duidelijk, mijns insziens. Niets niet "willekeurige output".

In 2001 waren er 50 calculators, 2700 computers en 250 TV's verkocht. Totaal (USA | NULL) is 3000
In 2001 waren er in Finland alleen maar 10 Phones verkocht. Totaal in 2001 is dus 3010. (2001 |NULL |NULL)

En het laatste record is het totaal van 2000 (2000 | NULL | NULL | = 4525) plus het totaal van 2001 (wat ik net al zei 3010) dus dat is 7535 en dat is het totaal aantal gevonden records.


Of het misgaat als je GROUP BY doet op meerdere kolommen weet ik niet.
 
Joren de Wit

Joren de Wit

30/01/2007 12:34:00
Quote Anchor link
Nee het is inderdaad geen willekeurige output, het zijn gewoon de running totals van eerdere aggregate functies.

Maar waar het probleem ligt is dat je niet weet welke waarde wat precies voorstelt. Met andere woorden, je moet voordat je zo'n query uitvoert eigenlijk al precies weten wat de uitkomst gaat zijn. Je moet wel zeker weten dat het totaal in bovenstaande op regel 24 weergegeven wordt, en daar komt in ieder geval nog wat php code aan te pas.

Je moet namelijk gaan controleren of de velden year, country en/of product NULL zijn, en aan de hand daarvan moet je gaan bepalen welke waarde er in dat record weergegeven wordt.
 
Robert Deiman

Robert Deiman

30/01/2007 12:40:00
Quote Anchor link
@Blanche

Dat klopt, maar ik wou het toch even zeggen. Omdat er anders misverstanden over kunnen ontstaan, of het nu wel of niet doet waarvoor het is bedoeld. En dat doet het dus wel.

Ik snap dat het probleem daar ligt, dat je niet weet welke regel welk resultaat heeft.

Het ging mij er meer om dat de functie in sommige gevallen handig kan zijn, maar als je ervanuit gaat dat het "willekeurig resultaat" teruggeeft, dan zou je het niet durven gebruiken.:)
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.