@@ -21,6 +21,10 @@ inhalt:
2121 anchor : bedingung
2222 simple : " "
2323
24+ - name : " Blockweise Sortierung"
25+ anchor : block
26+ simple : " "
27+
2428 - name : " Querverweise"
2529 anchor : links
2630 simple : " "
@@ -163,6 +167,143 @@ SELECT name, date_birth FROM persons ORDER BY date_birth IS NULL DESC, name
163167~~~
164168
165169
170+
171+ ## [ Blockweise Sortierung] ( #block )
172+ {: #block}
173+
174+ Wir haben Kunden und zu jedem Kunden mehrere Aufträge.
175+ Wir wollen uns Kunden mit den Aufträgen ausgeben lassen,
176+ jedoch soll die Ausgabe der "Kundenblöcke" so ausgegeben werden,
177+ dass der Block mit dem aktuellsten/jüngsten Datum zuerst kommt.
178+
179+
180+ Die Kunden
181+
182+ ~~~ sql
183+ SELECT id, name FROM kunde
184+
185+ + -- --+----------+
186+ | id | name |
187+ + -- --+----------+
188+ | 1 | Aigner |
189+ | 2 | Gruber |
190+ | 3 | Sandmann |
191+ + -- --+----------+
192+ 3 rows in set (0 .00 sec)
193+ ~~~
194+
195+
196+ Die Aufträge
197+
198+ ~~~ sql
199+ SELECT id, kunde_id, produkt, deadline
200+ FROM auftrag
201+ ORDER BY deadline
202+
203+ + -- --+----------+--------------+------------+
204+ | id | kunde_id | produkt | deadline |
205+ + -- --+----------+--------------+------------+
206+ | 1 | 3 | Tisch eckig | 2017 - 02 - 01 |
207+ | 4 | 1 | Kasten | 2017 - 03 - 15 |
208+ | 7 | 2 | Gartenzaun | 2017 - 04 - 01 |
209+ | 5 | 1 | Tisch rund | 2017 - 04 - 15 |
210+ | 2 | 3 | Vitrine | 2017 - 05 - 01 |
211+ | 9 | 2 | Schreibtisch | 2017 - 09 - 01 |
212+ | 6 | 1 | Essecke | 2017 - 10 - 01 |
213+ | 8 | 2 | Carport | 2017 - 10 - 15 |
214+ | 3 | 3 | Lampe | 2018 - 02 - 01 |
215+ + -- --+----------+--------------+------------+
216+ 9 rows in set (0 .00 sec)
217+ ~~~
218+
219+
220+ Ergibt "gejoint"
221+
222+ ~~~ sql
223+ SELECT k .id , k .name , a .produkt , a .deadline
224+ FROM kunde k
225+ INNER JOIN auftrag a ON k .id = a .kunde_id
226+ ORDER BY deadline
227+
228+ + -- --+----------+--------------+------------+
229+ | id | name | produkt | deadline |
230+ + -- --+----------+--------------+------------+
231+ | 3 | Sandmann | Tisch eckig | 2017 - 02 - 01 |
232+ | 1 | Aigner | Kasten | 2017 - 03 - 15 |
233+ | 2 | Gruber | Gartenzaun | 2017 - 04 - 01 |
234+ | 1 | Aigner | Tisch rund | 2017 - 04 - 15 |
235+ | 3 | Sandmann | Vitrine | 2017 - 05 - 01 |
236+ | 2 | Gruber | Schreibtisch | 2017 - 09 - 01 |
237+ | 1 | Aigner | Essecke | 2017 - 10 - 01 |
238+ | 2 | Gruber | Carport | 2017 - 10 - 15 |
239+ | 3 | Sandmann | Lampe | 2018 - 02 - 01 |
240+ + -- --+----------+--------------+------------+
241+ 9 rows in set (0 .00 sec)
242+ ~~~
243+
244+
245+ Um die Blöcke nach dem aktuellsten Datum sortieren zu können,
246+ brauchen wir zuerst mal das jeweils jüngste Datum der Aufträge
247+ je Kunde.
248+
249+ ~~~ sql
250+ SELECT k .id , k .name , MIN (a .deadline ) AS min_date
251+ FROM kunde k
252+ INNER JOIN auftrag a ON k .id = a .kunde_id
253+ GROUP BY k .id , k .name
254+ ORDER BY min_date
255+
256+ + -- --+----------+------------+
257+ | id | name | min_date |
258+ + -- --+----------+------------+
259+ | 3 | Sandmann | 2017 - 02 - 01 |
260+ | 1 | Aigner | 2017 - 03 - 15 |
261+ | 2 | Gruber | 2017 - 04 - 01 |
262+ + -- --+----------+------------+
263+ 3 rows in set (0 .00 sec)
264+ ~~~
265+
266+ Nun verwenden wir diese Daten als "innere" Tabelle
267+ und joinen uns den Rest wie benötigt dazu.
268+
269+ ~~~ sql
270+ SELECT
271+ k .id , k .name ,
272+ a .produkt , a .deadline ,
273+ sub .min_date
274+ FROM
275+ (
276+ -- frühestes deadline-datum je kunde
277+ SELECT k .id , MIN (a .deadline ) AS min_date
278+ FROM kunde k
279+ INNER JOIN auftrag a ON k .id = a .kunde_id
280+ GROUP BY k .id
281+ ORDER BY min_date
282+ ) sub
283+ INNER JOIN kunde k ON sub .id = k .id
284+ INNER JOIN auftrag a ON k .id = a .kunde_id
285+ ORDER BY sub .min_date , a .deadline
286+
287+ + -- --+----------+--------------+------------+------------+
288+ | id | name | produkt | deadline | min_date |
289+ + -- --+----------+--------------+------------+------------+
290+ | 3 | Sandmann | Tisch eckig | 2017 - 02 - 01 | 2017 - 02 - 01 |
291+ | 3 | Sandmann | Vitrine | 2017 - 05 - 01 | 2017 - 02 - 01 |
292+ | 3 | Sandmann | Lampe | 2018 - 02 - 01 | 2017 - 02 - 01 |
293+ | 1 | Aigner | Kasten | 2017 - 03 - 15 | 2017 - 03 - 15 |
294+ | 1 | Aigner | Tisch rund | 2017 - 04 - 15 | 2017 - 03 - 15 |
295+ | 1 | Aigner | Essecke | 2017 - 10 - 01 | 2017 - 03 - 15 |
296+ | 2 | Gruber | Gartenzaun | 2017 - 04 - 01 | 2017 - 04 - 01 |
297+ | 2 | Gruber | Schreibtisch | 2017 - 09 - 01 | 2017 - 04 - 01 |
298+ | 2 | Gruber | Carport | 2017 - 10 - 15 | 2017 - 04 - 01 |
299+ + -- --+----------+--------------+------------+------------+
300+ 9 rows in set (0 .00 sec)
301+ ~~~
302+
303+ Fertig! Dies kann nun mit dem [ Gruppenbruch] ({{ page.root }}/jumpto/gruppenbruch/) entprechend blockweise nach Kunden ausgegeben werden.
304+
305+
306+
166307## [ Querverweise] ( #bedingung )
167308{: #links}
168309
0 commit comments