[SQL] optellen van rijen

Pagina: 1
Acties:
  • 219 views sinds 30-01-2008
  • Reageer

  • B2
  • Registratie: April 2000
  • Laatst online: 14:01

B2

wa' seggie?

Topicstarter
Ik heb de volgende query
code:
1
2
3
4
5
6
7
SELECT categories.name AS catname, categories.aantal, COUNT(products.name) AS tel, DATEDIFF(hour, o_timestamp, af_timestamp) AS uren_offline
FROM products, categories, products_categories
WHERE products.id = products_categories.product_id
AND categories.id = products_categories.category_id
AND month(o_timestamp) = 3
AND year(o_timestamp) = 2002
GROUP by categories.id, categories.name, categories.aantal, o_timestamp, af_timestamp

Nu krijg ik alleen voor elk result een nieuwe rij in de tabel. Wat ik wil is dus bv als er 2 klachten uit 1 categorie zijn, er dus maar 1 rij voor die categorie te zien is, en het aantal klachten (COUNT products.name) verhoogt wordt.

dus zoiets
code:
1
2
3
4
catname aantal tel uren_offline
PHAROS    4     1     44
FR/FFR    6     1     23
FR/FFR    6     1     23

moet dus worden
code:
1
2
3
catname aantal tel uren_offline
PHAROS    4     1     44
FR/FFR    6     2     23

Verwijderd

Moet je dan niet sum ipv count gebruiken ? :?
Anders moet je het eerst ff in een subquery zetten enzo.

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Dat moet je eerst beslissen wat je met die datediff moet gebeuren aangezien die buiten de groepering gaat vallen.

Who is John Galt?


Verwijderd

Op maandag 11 maart 2002 11:19 schreef DragonLord het volgende:
Moet je dan niet sum ipv count gebruiken ? :?
Anders moet je het eerst ff in een subquery zetten enzo.
Mysql kent geen subqueries... maar aangezien de topic [SQL] bevat, zal ik me mond wel weer houden :P

Verwijderd

Op maandag 11 maart 2002 11:27 schreef DiStance het volgende:

[..]

Mysql kent geen subqueries... maar aangezien de topic [SQL] bevat, zal ik me mond wel weer houden :P
Okay wacht dacht je dan van een join functie of heeft Mysql dat ook niet ?

Verwijderd

Op maandag 11 maart 2002 11:29 schreef DragonLord het volgende:

[..]

Okay wacht dacht je dan van een join functie of heeft Mysql dat ook niet ?
Idd join functie zit wel in MySQL enkel is het wel een complex werkje om een lange/grote subquery om te zetten naar een JOIN!

btw...Sub Query support is geplanned voor MySQL versie 4.1
JOEPIE :)

Verwijderd

Op maandag 11 maart 2002 11:35 schreef skunkah het volgende:

[..]

Idd join functie zit wel in MySQL enkel is het wel een complex werkje om een lange/grote subquery om te zetten naar een JOIN!

btw...Sub Query support is geplanned voor MySQL versie 4.1
JOEPIE :)
weet niet of je hier wat aan hebt *D
http://www.mysql.com/doc/A/N/ANSI_diff_Sub-selects.html

Verwijderd

Ja maar het werken met subquery's versnelt toch wel het doorploeteren van je machine in de database.
Nu moet hij 2 (grote :?) tabellen koppelen en een deel wegpleuren omdat de datum achteraf niet klopt (where statement).

Heb je dat al in een subquery gebruikt, dan hoeft er minder gekoppeld te worden en later ook niet weer weggegooid worden.

Blij dat ik toch nog maar met SQL-server werk :)

  • B2
  • Registratie: April 2000
  • Laatst online: 14:01

B2

wa' seggie?

Topicstarter
pomdipom............het is MSSQL..

Verwijderd

Op maandag 11 maart 2002 13:01 schreef postduif het volgende:
pomdipom............het is MSSQL..
Daar ging ik ook vanuit. :)

Het was DiStance die begon over het Mysql wat geen subquery's kent. :r dus

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12-09 21:31

Janoz

Moderator Devschuur®

!litemod

Op maandag 11 maart 2002 13:11 schreef DragonLord het volgende:
Het was DiStance die begon over het Mysql wat geen subquery's kent. :r dus
Nou, dat :r vind ik ook weer niet echt nodig. Het is helemaal niet zo vreemd waneer mensen er hier vanuit gaan dat er MySQL gebruikt wordt. 8 op de 10 topics over sql hier gaan over mysql, dus waneer iemand niet heeft aangegeven welke database er precies gebruikt wordt is het helemaal niet zo vreemd dat iemand daar vanuit gaat.

Maar eigenlijk ging DiStance er helemaal niet vanuit. Als je z'n eerste post leest zie je dat hij duidelijk aangeeft dat hij niet weet welke db er wordt gebruikt.

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


Verwijderd

Ja maar toch wel jammer dat Mysql het nu nog niet ondersteund. :?
Ik hoor wel lovende dingen over Mysql maar als ik dan hoor dat je met omwegen en join functies moet gaan werken dan weet ik genoeg. :)

Maar ff on-topic: werkt grovert zijn query al :?

  • B2
  • Registratie: April 2000
  • Laatst online: 14:01

B2

wa' seggie?

Topicstarter
Op maandag 11 maart 2002 15:45 schreef DragonLord het volgende:
Maar ff on-topic: werkt grovert zijn query al :?
hehe, nee tenminste ik heb er nog niet zoveel na gekeken, dan iets gespeeld met SUM.
Maar goed daar kun je geen varchar types mee optellen (logisch) dus dat helpt nog niet veel.
De query moet echt kijken hoeveel klachten zijn er in die categorie en dat als 1 rij weergeven (en niet dus elke klacht op een rij zoals nu)
Maar morgen is er weer een dag, en we zullen dan wel weer eens kijken.

Verwijderd

Er was laatst een Access-topic over hetzelfde: [topic=389775]

  • B2
  • Registratie: April 2000
  • Laatst online: 14:01

B2

wa' seggie?

Topicstarter
ben er toenet nog weer even mee bezig geweest, en heb een query gemaakt (die natuurlijk niet werkt, maar het geeft een idee hoe ik het wil).
code:
1
2
3
4
5
6
SELECT COUNT(p.name) AS tel
FROM products p, categories c, products_categories pc
WHERE p.id = pc.product_id
AND c.id = pc.category_id
AND (SELECT SUM(tel) FROM products WHERE c.name = c.name)
GROUP BY p.name

natuurlijk klopt deze niet, maar even kort uitgelegd : Wanneer dus een categorie 2x voorkomt in het rijtje, dan moet er 1x de categorie gedisplayed worden en de rij tel bij elkaar opgeteld worden.
Op zich werkt dit niet, want tel is een alias van p.name(Varchar) en varchars kun je niet optellen.

Verwijderd

Kun je het keyword DISTINCT niet ergens tactisch inbouwen? bijvoorbeeld COUNT(DISTINCT catname) o.i.d. ....
ff nog geen zin om helemaal wakker te worden en het te testen. ;)

  • B2
  • Registratie: April 2000
  • Laatst online: 14:01

B2

wa' seggie?

Topicstarter
Op dinsdag 12 maart 2002 10:07 schreef Hieronymus het volgende:
Kun je het keyword DISTINCT niet ergens tactisch inbouwen? bijvoorbeeld COUNT(DISTINCT catname) o.i.d. ....
ff nog geen zin om helemaal wakker te worden en het te testen. ;)
Nope, volgens mij gaat dat ook niet werken.
Is er ook geen mogelijkheid om de rijen in de toch al bestaande php scripts op te tellen?

  • Sircuri
  • Registratie: Oktober 2001
  • Niet online

Sircuri

Volledig Appelig

zover ik weet moet het wel met DISTINCT.

SELECT DISTINCT categories.name AS catname

Deze geeft elke UNIEKE categories.name in de SQL statement.
Je zou dan eens moeten kijken wat ie precies teruggeeft voor die COUNT statement die je gebruikt, want dat weet ik dan niet.

Signature van nature


  • B2
  • Registratie: April 2000
  • Laatst online: 14:01

B2

wa' seggie?

Topicstarter
Op woensdag 13 maart 2002 18:53 schreef Sircuri het volgende:
zover ik weet moet het wel met DISTINCT.

SELECT DISTINCT categories.name AS catname

Deze geeft elke UNIEKE categories.name in de SQL statement.
Je zou dan eens moeten kijken wat ie precies teruggeeft voor die COUNT statement die je gebruikt, want dat weet ik dan niet.
Ik zal het morgen nog eens proberen, zoiets zou natuurlijk wel moeten werken voor het samenvoegen.

Verwijderd

In mssql zit een querybuilder. Ik adviseer je die te gebruiken. Het optellen van Varchar waardes kan overigens wel, volgens mij als je CAST() er om heen zet.

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

Je moet om de datediff een max of min zetten, dan doet ie het volgens mij. Ook even bij de group by de timestamps weghalen
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT c.name AS catname
    ,c.aantal
    ,COUNT(p.name) AS tel
    ,max(DATEDIFF(hour, o_timestamp, af_timestamp)) AS uren_offline
FROM   products p
    ,categories c
    ,products_categories pc
WHERE  p.id = pc.product_id
AND    c.id = pc.category_id
AND    month(o_timestamp) = 3
AND    year(o_timestamp) = 2002
GROUP BY c.id
      ,c.name
      ,c.aantal

PS het is gebruikelijk om tabelnamen in enkelvoud te spellen
Ik weet niet uit welke tabel de timestamps komen maar daar moet je ook nog even de tabel alias opnemen voor de kolomnaam. Suc6
Pagina: 1