[taalonafhankelijk?] data groeperen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met een ontwerp die een sql-resultaat als tabel weergeeft. Simpel gezegd en zo gedaan.

Sorteren/filter-opties lukken natuurlijk wel, nu wil ik die output ook gegroepeerd kunnen weergeven:

voorbeeld: zie onder, je kunt een kolom slepen en de data wordt op die kolom gegroepeerd.
http://demos.devexpress.c...pingSorting/Grouping.aspx

Ik ben op zoek naar de techniek/methode achter de weergave van het gegroepeerd weergeven. Dus niet een specifiek stuk code maar uitleg van de techniek erachter. Oftewel hoe moet ik mijn dataset opbouwen en gebruiken.

Dit `wiel` is al uitgevonden maar google is deze maal niet mijn vriend gebleken. Elke uitleg of verwijzing naar artikelen zijn zeer welkom.

Acties:
  • 0 Henk 'm!

  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 15:25
Ik kan zo twee manieren bedenken waarop je dit kan bereiken. De eerste is om eerst te sorteren op categorie en dan pas op naam. Zo heb je alles per groep al bij elkaar en dan kan je er bij het weergeven van je data er al van uit gaan dat er niet iets van een groep in de tabel voorkomt als die groep al geweest is. De andere is om eerst een lijst met groepen op te halen/bepalen (als je deze al niet van te voren weet) en vervolgens per groep de data ophalen. Op deze manier heb je dus per groep een tabel.

Maar misschien kan je wat duidelijk zijn in wat je precies wilt weten, dit is immers een vrij basic vraag zoals jij hem nu stelt en welke methode je gaat gebruiken zal ook af hangen van hoe je de data wil gaan toepassen.

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Als ik dit zie moet ik denken aan de agenda die ik een tijdje geleden heb gebouwd: http://krashna.nl/nl/agenda

Wat daar gebeurt is eigenlijk heel simpel, met pseudo code:
Maand = null
Voor elk EventList als Event
  Als Maand != Event.Maand: Print Maand
  Print Event
  Maand = Event.Maand
Dus alleen als er een wisseling is van de maand laat je dat zien. Verder kan je in je query prima ordenen per maand en dat af- of oplopend sorteren. Dat is eigenlijk toch ook wat er in jouw voorbeeld gebeurt? Alleen zit naar nog een paginator in, maar dat moet los staan van dit probleem
Invisible_man schreef op woensdag 10 juni 2009 @ 19:12:
Ik kan zo twee manieren bedenken waarop je dit kan bereiken. De eerste is om eerst te sorteren op categorie en dan pas op naam. Zo heb je alles per groep al bij elkaar en dan kan je er bij het weergeven van je data er al van uit gaan dat er niet iets van een groep in de tabel voorkomt als die groep al geweest is. De andere is om eerst een lijst met groepen op te halen/bepalen (als je deze al niet van te voren weet) en vervolgens per groep de data ophalen. Op deze manier heb je dus per groep een tabel.

Maar misschien kan je wat duidelijk zijn in wat je precies wilt weten, dit is immers een vrij basic vraag zoals jij hem nu stelt en welke methode je gaat gebruiken zal ook af hangen van hoe je de data wil gaan toepassen.
Die tweede methode is natuurlijk een stuk intensiever, omdat je heel veel queries aan het uitvoeren bent. De hele zooi joinen en die als bovenstaande methode formatten is een stuk sneller.

offtopic:
De widgets zien er wel heel erg hetzelfde uit als ExtJS...

[ Voor 49% gewijzigd door mithras op 10-06-2009 19:19 ]


Acties:
  • 0 Henk 'm!

  • Jeldert
  • Registratie: Juni 2001
  • Niet online

Jeldert

Rozijntjes

Volgens mij is het zo simpel als in SQL gewoon sorteren op de gekozen kolom. Dan moet je in je weergave over je resultaten loopen, en als er een andere waarde in de gekozen kolom staat een nieuwe header printen.

Dus (in pseude-code):
code:
1
2
3
4
5
6
7
8
9
10
results = sql.query... (met sortering)

var lastFound = null
for each (row in results) {
  if (row.column.value != lastFound) {
    printHeader
   }
   printRow
   lastFound = row.column.value
}


Spuit 11 8)7

Juist


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
code:
1
2
3
4
5
6
7
8
current = null
foreach row in result
  if row.column1.value != current
    current = row.column1.value
    print current
  end if
  print row.column2.value
next


Zo doe ik het altijd en wordt "current" niet zo vaak ge-set (niet dat het nou heel erg boeit...)

[ Voor 14% gewijzigd door RobIII op 10-06-2009 19:20 ]

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


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok, even heel globaal samengevat...sorteren per groepering en een nieuwe header weergeven als vorige rij ongelijk is aan de huidige.

Zo had ik het inderdaad ook ongeveer uitgedokterd.

1. Dit werkt volgens mij echter alleen als je weet hoeveel groeperingen je hebt (per groepering een lus). De bedoeling is dat het net als in het voorbeeld afhankelijk is van de gebruikerskeuze.
2. Lege groepjes worden niet weergegeven want ze zijn leeg, maar ook de header wordt niet weergegeven en dat is wel wenselijk.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op woensdag 10 juni 2009 @ 22:31:
1. Dit werkt volgens mij echter alleen als je weet hoeveel groeperingen je hebt (per groepering een lus). De bedoeling is dat het net als in het voorbeeld afhankelijk is van de gebruikerskeuze.
Daar heb je recursie voor...
Verwijderd schreef op woensdag 10 juni 2009 @ 22:31:
2. Lege groepjes worden niet weergegeven want ze zijn leeg, maar ook de header wordt niet weergegeven en dat is wel wenselijk.
Dat is wat lastig(er), zeker als je het met maar 1 query wil doen...

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


Acties:
  • 0 Henk 'm!

  • ValHallASW
  • Registratie: Februari 2003
  • Niet online
Verwijderd schreef op woensdag 10 juni 2009 @ 22:31:
2. Lege groepjes worden niet weergegeven want ze zijn leeg, maar ook de header wordt niet weergegeven en dat is wel wenselijk.
Outer join en de data niet weergeven als er NULL uitkomt?

Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 16-09 13:49

Patriot

Fulltime #whatpulsert

Volgens mij kun je met de eerder genoemde knipsels en de volgende query een eind komen:

SQL:
1
2
3
4
5
6
7
8
9
SELECT
  g.name, g.group_id, e.name, e.entry_id
FROM
  groups AS g
LEFT JOIN
  entries AS e
  USING(group_id)
ORDER BY
  g.group_id ASC, e.name ASC


Zo krijg je namelijk óók de lege groepjes.

[ Voor 8% gewijzigd door Patriot op 10-06-2009 23:34 ]

Pagina: 1