Σου έγραψα κάποια πράγματα για τους Normal Forms (Κανονικές Μορφές) αλλά δυστυχώς ένα αναπάντεχο crash ήταν η αιτία να χαθούν. Παντως, για να δεις ορισμένα πράγματα για τις κανονικές μορφές (οι οποίες αποτελούν guidelines για το σχεδιασμό σχεσιακών βάσεων δεδομένων) μπορείς να πας π.χ. εδώ:
http://www.answers.com/topic/database-normalization
http://www.phlonx.com/resources/nf3/
http://en.wikipedia.org/wiki/Database_normalization
Ο επαναλαμβανόμενος αριθμός ομοειδών πεδίων σε μια γραμμή με τον κίνδυνο κάποια να μένουν κενά ειναι απαγορευτικός από τα εν λόγω guidelines, εμμέσως μεν, σαφώς δε. Προκύπτουν διάφορα προβλήματα ως προς το χώρο αποθήκευσης αλλά και την ενημέρωση σε περίπτωση π.χ. που θέλεις να διαγράψεις ολοσχερώς κάποιο συμμετέχοντα (σε ποιό από τα 18 πεδία βρίσκεται σε κάθε εγγραφή);
Για να δούμε όμως μια άλλη προσέγγιση της σχεδίασης που βρίσκεται στον 3NF:

Εχω αυθαιρετήσει λιγάκι ως προς τον πίνακα tblMembersList λόγω του οτι δεν ειχα ιδιαίτερη πληροφορία για αυτόν. Αυτό που κάνω εδώ είναι να έχω ορίσει ένα πίνακα για τα groups (θεωρώ οτι ένα group είναι η ονομασία του και η ημ/νία του - δηλ. ουσιαστικά η δημιουργία ενός group είναι η ημ/νία του) και σε αυτο μπορούν να συμμετέχουν n συμμετέχοντες οι οποίοι επιλέγονται από τον πίνακα tblMembersList. Ως ενδιάμεσο πίνακα έχω τον πίνακα tblParticipations, του οποίου κάθε γραμμή είναι το primary key (ενα autonumber), και ο συνδυασμός groupid/memberid. Καθε γραμμή του πίνακα δηλ. είναι μια συμμετοχή ενός ατόμου σε ένα γκρουπ. (Το primary key - participationID θα μπορούσε και να μην υπάρχει, μια και ο συνδυασμός groupid/memberid προσδιορίζει μοναδικά κάθε εγγραφή του πίνακα - είναι από μόνη της ένα surrogate key).
Ετσι έχεις την ευκολία να ορίσεις από έναν ως n συμμετέχοντες σε κάθε γκρουπ, ενώ αν θέλεις περιορισμούς ως προς το μέγιστο αριθμό μπορείς να τους επιβάλλεις στην πλευρά του user interface.
Για να κάνουμε το Query που θέλεις σε αυτό τον πίνακα:
SELECT tblMembersList.memberName, tblGroup.groupDescription, tblGroup.groupDate
FROM tblMembersList INNER JOIN (tblGroup INNER JOIN tblParticipations ON tblGroup.groupID = tblParticipations.groupId) ON tblMembersList.memberId = tblParticipations.memberId
ORDER BY tblMembersList.memberName, tblGroup.groupDescription, tblGroup.groupDate;
Και σχηματικά:

Το αποτέλεσμα που παίρνω (χρησιμοποίησα το πεδίο groupDescription αντί του groupID για να είναι πιό ξεκάθαρο):

Ο χρόνος εκτέλεσης είναι αμελητέος.
Βεβαια, δεν ειμαι απόλυτα σίγουρος οτι θέλεις να κάνεις ακριβώς αυτό, όμως με βάση τα δεδομένα που μας δίνεις, κατά 90% θα πρέπει να σε καλύπτει κάτι τέτοιο.
Σωτήρης Φιλιππίδης
DotSee Web Services