Darstellung von Kursen und Kursleitern

Darstellung von Kursen und Kursleitern

am 31.07.2007 14:08:09 von Michael Ziegler

Hallo,

ich hab grade den Artikel "You get what you ask for" auf
WorseThanFailure[1] gelesen. In diesem erhält ein Kandidat im Zuge eines
Bewerbungsverfahrens einige Aufgaben[2] gestellt, und ich habe versucht
diese Aufgaben mal selbst zu lösen.


Besonders interessiert mich die Aufgabe 2, die wie folgt gestellt ist:

Gegeben sind zwei Tabellen, die der Kurse:
> select * from courses;
+-----------+------+
| course_no | name |
+-----------+------+
| 1 | C0 |
| 2 | C1 |
| 3 | C2 |
+-----------+------+
3 rows in set (0.00 sec)

und die der Kursleiter:

> select * from instructors;
+-----------+------+
| course_no | name |
+-----------+------+
| 1 | EY |
| 2 | ED |
| 2 | NW |
| 3 | ba |
| 3 | bb |
| 3 | bc |
+-----------+------+
6 rows in set (0.00 sec)


Gefordert ist ein SQL-Statement, welches eine Tabelle liefert, die die
Kurse mit den Kursleitern in Verbindung bringt, und folgendermaßen
aufgebaut ist:
- Drei Felder: Kursnummer, Leiter1, Leiter2
- Wenn es genau einen Kursleiter gibt, dessen Name in Leiter1, Leiter2 =
NULL
- Wenn es genau zwei Kursleiter gibt, deren Namen in den einzelnen
Feldern alphabetisch sortiert
- Wenn es mehr als zwei Kursleiter gibt, 'Committee' in Leiter1, Leiter2
= NULL.


Ich bin bei meinen Versuchen, so eine Ausgabe zu erzeugen leider nicht
besonders weit gekommen... Wie könnte man sowas lösen?


Viele Grüße,
Michael


[1] http://worsethanfailure.com/Articles/You-Get-What-You-Ask-Fo r.aspx
[2] http://img.worsethanfailure.com/images/200707/writtenTest.do c

--
Testscript für RegEchsen:
http://diesundas.funzt-halt.net/regextest.php

Re: Darstellung von Kursen und Kursleitern

am 31.07.2007 15:40:20 von dnoeth

Michael Ziegler wrote:

> Gegeben sind zwei Tabellen, die der Kurse:
> > select * from courses;
> +-----------+------+
> | course_no | name |
> +-----------+------+
> | 1 | C0 |
> | 2 | C1 |
> | 3 | C2 |
> +-----------+------+
> 3 rows in set (0.00 sec)
>
> und die der Kursleiter:
>
> > select * from instructors;
> +-----------+------+
> | course_no | name |
> +-----------+------+
> | 1 | EY |
> | 2 | ED |
> | 2 | NW |
> | 3 | ba |
> | 3 | bb |
> | 3 | bc |
> +-----------+------+
> 6 rows in set (0.00 sec)
>
>
> Gefordert ist ein SQL-Statement, welches eine Tabelle liefert, die die
> Kurse mit den Kursleitern in Verbindung bringt, und folgendermaßen
> aufgebaut ist:
> - Drei Felder: Kursnummer, Leiter1, Leiter2
> - Wenn es genau einen Kursleiter gibt, dessen Name in Leiter1, Leiter2 =
> NULL
> - Wenn es genau zwei Kursleiter gibt, deren Namen in den einzelnen
> Feldern alphabetisch sortiert
> - Wenn es mehr als zwei Kursleiter gibt, 'Committee' in Leiter1, Leiter2
> = NULL.

Typische Frage, typische Antwort :-)

SELECT
c.course_no,
CASE WHEN COUNT(*) > 2 THEN 'Committee' ELSE MIN(i.name) END,
CASE WHEN COUNT(*) = 2 THEN MAX(i.name) END
FROM courses AS c JOIN instructors AS i
ON i.course_no = c.course_no
GROUP BY c.course_no;

Dieter

Re: Darstellung von Kursen und Kursleitern

am 31.07.2007 15:50:42 von Michael Ziegler

Dieter Noeth wrote:
> Typische Frage, typische Antwort :-)
>
> SELECT
> c.course_no,
> CASE WHEN COUNT(*) > 2 THEN 'Committee' ELSE MIN(i.name) END,
> CASE WHEN COUNT(*) = 2 THEN MAX(i.name) END
> FROM courses AS c JOIN instructors AS i
> ON i.course_no = c.course_no
> GROUP BY c.course_no;

Ok, ich glaub ich sollte mich langsam echt mal mit diesen Case-Dingern
anfreunden :)

Vielen Dank!

Michael

--
Testscript für RegEchsen:
http://diesundas.funzt-halt.net/regextest.php

Re: Darstellung von Kursen und Kursleitern

am 31.07.2007 20:27:21 von Oliver Lehmann

Die Loesung fuer den Einsatz mit CASE ist ja bereits gepostet worden.
Wenn man ein RDBMS ohne CASE hat, geht auch folgendes (natuerlich nicht
so performant!)

mysql> SELECT a.course_no
-> ,b.name Instructor1
-> ,NULL Instructor2
-> FROM courses a
-> ,instructors b
-> WHERE a.course_no = b.course_no
-> GROUP BY course_no
-> HAVING COUNT(*) = 1
-> UNION
-> SELECT a.course_no
-> ,MIN(b.name) Instructor1
-> ,MAX(b.name) Instructor2
-> FROM courses a
-> ,instructors b
-> WHERE a.course_no = b.course_no
-> GROUP BY course_no
-> HAVING COUNT(*) = 2
-> UNION
-> SELECT a.course_no
-> ,'Committee' Instructor1
-> ,NULL Instructor2
-> FROM courses a
-> ,instructors b
-> WHERE a.course_no = b.course_no
-> GROUP BY course_no
-> HAVING COUNT(*) > 2;
+-----------+-------------+-------------+
| course_no | Instructor1 | Instructor2 |
+-----------+-------------+-------------+
| 1 | EY | NULL |
| 2 | ED | NW |
| 3 | Committee | NULL |
+-----------+-------------+-------------+
3 rows in set (0.00 sec)

mysql>

--
Oliver Lehmann
http://www.pofo.de/
http://wishlist.ans-netz.de/