Laden...

Sortieren in der Datenbank - 2 mal die gleiche (Datums-)Spalte

Erstellt von BeZi vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.117 Views
B
BeZi Themenstarter:in
153 Beiträge seit 2007
vor 9 Jahren
Sortieren in der Datenbank - 2 mal die gleiche (Datums-)Spalte

-> Access oder DataSet

Nabend,

ich finde leider nichts passendes im Netz oder ich Suche falsch. Ich habe folgendes Problem

Ich habe eine Datenbank mit 3 Spalten ID | SpA | Zugriff

1 | A | 01.01.2004
2 | B | 01.01.2001
3 | B | 01.01.2002
4 | C | 01.01.2000
5 | A | 01.01.2003
6 | B | 01.01.2000
7 | C | 01.01.2001
...

So und ich möchte die Reihe jetzt sortieren nach folgendem Schema:

Zugriff [Datum], SPA[Text] und nochmal Zugriff --> ID | SpA | Zugriff

6 | B | 01.01.2000
2 | B | 01.01.2001
3 | B | 01.01.2002
4 | C | 01.01.2000 <- Ab hier C und wieder kleinestes Datum (kleiner als ID 2)
7 | C | 01.01.2001
5 | A | 01.01.2003 <- Ab hier A und wieder starten mit dem kleinsten Datum
1 | A | 01.01.2004
...

Nur nach Datum reicht nicht. Also müsste erst nach Datum und dann nach Datum und SpA sotiert werden. Gibt es da eine Möglichkeit ? Ich finde keiner "ORDER BY" - Klausel oder muss ich das mittel Code lösen ?

Merci

M
19 Beiträge seit 2014
vor 9 Jahren

Sorry, aber das verstehe ich nicht ganz. Dann ist die Sortierordnung doch einfach SpA und dann Zugriff.

Wie soll sich denn eine Sortierung von Zugriff an dritter Stelle auswirken, wenn schon an erster Stelle in der Sortierordnung stand?

Dein Beispiel spiegelt das auch nicht wider. Denn wäre nach Zugriff zuerst sortiert, könnte nach dem 01.01.2002 in der dritten Zeile nicht der 01.01.2000 in der vierten folgen ...

B
BeZi Themenstarter:in
153 Beiträge seit 2007
vor 9 Jahren

Nein das wäre KEINE Sortierung nach SpA und dann Datum dann würde es ja nicht mit B beginnen sondern mit A

FALSCH:
wenn ich erst nach SpA sortieren würde und dann Datum würde es so aussehen

ID | SpA | Zugriff

5 | A | 01.01.2003 (<--- NICHT DAS KLEINSTE DATUM über alle Datensätze

1 | A | 01.01.2004
6 | B | 01.01.2000
2 | B | 01.01.2001
3 | B | 01.01.2002
4 | C | 01.01.2000
7 | C | 01.01.2001
...

AUCH FALSCH:
Sortierung nur nach SpA

ID | SpA | Zugriff

1 | A | 01.01.2004
5 | A | 01.01.2003
2 | B | 01.01.2001
3 | B | 01.01.2002
6 | B | 01.01.2000
4 | C | 01.01.2000
7 | C | 01.01.2001
...

Originaltabelle

ID | SpA | Zugriff

1 | A | 01.01.2004
2 | B | 01.01.2001
3 | B | 01.01.2002
4 | C | 01.01.2000
5 | A | 01.01.2003
6 | B | 01.01.2000
7 | C | 01.01.2001
...

DAS WÄRE richtig !!! ID | SpA | Zugriff

6 | B | 01.01.2000 <--> Block B - kleinstes Datum Von B (B kommt vor A
2 | B | 01.01.2001 <--> Block B
3 | B | 01.01.2002 <--> Block B - größtes Datum B

4 | C | 01.01.2000 <--> Block C - 2. Block C kommt aber nach B beginnend mit kleinstem Datum
7 | C | 01.01.2001 <--> Block C

5 | A | 01.01.2003 <--> Block A - kleinstes Datum von A (liegt aber hinter kleinstem Datum von B und C
1 | A | 01.01.2004 <--> Block A

...

Hat jemand einen Tip ?

16.827 Beiträge seit 2008
vor 9 Jahren

ähm.. natürlich gibt es in Access eine Order By Klausel und natürlich kannst Du da erst nach dem einen und dann nach dem anderen Sortieren.
Siehe die auch die Dokumentation dazu.

Irgendwie ist aber Deine Beschreibung unlogisch.
Du sagst, dass Du erst nach SpA sortieren willst und dann nach Datum, zeigst aber erst ein B, dann ein C und danach ein A.
Könnte sein, dass irgendeine Kultur so sortiert; mir ist aber keine Bekannt.

Das, was Du hier beschreibst und als Beispiel zeigst; ich sehe da irgendwie Differenzen und keine Logik.
Wenn Du nach SpA sortierst sieht es anders aus, wenn Du nur nach Datum sortierst wird es anders aussehen und wenn du es kombinierst ebenfalls.

B
BeZi Themenstarter:in
153 Beiträge seit 2007
vor 9 Jahren
  1. Die Überschrift sagt das ich nach Datum (eigentlich 2 mal) sotieren möchte.

  2. Wo habe ich expliziet gesagt das ich nach nur SpA sotieren will ? 🤔 Find ich nicht.

  3. Wo fehlt da die Logik ?

ID | SpA | Zugriff

6 | B | 01.01.2000 <--> Block B - kleinstes Datum von B (B kommt vor C)
2 | B | 01.01.2001 <--> Block B
3 | B | 01.01.2002 <--> Block B - größtes Datum B

4 | C | 01.01.2000 <--> Block C - 2. Block C kommt aber nach B beginnend mit kleinstem Datum
7 | C | 01.01.2001 <--> Block C

5 | A | 01.01.2003 <--> Block A - kleinstes Datum von A (liegt aber hinter kleinstem Datum von B und C
1 | A | 01.01.2004 <--> Block A[/font]

Es gibt kein verschiedene Inhalte in SpA diese sortieren und DANN nach Zugriff sortieren
und dann ALLE "Blöcke" nach Datum sortieren.

Könnte sein, dass irgendeine Kultur so sortiert; mir ist aber keine Bekannt.

  • Keine Ahnung was solche Sprüche immer sollen?

Wenn Du nach SpA sortierst sieht es anders aus, wenn Du nur nach Datum sortierst wird es anders aussehen und wenn du es kombinierst ebenfalls.

Deswegen frage ich nach 😉 Und wollte wissen ob etwas bekannt ist....

M
19 Beiträge seit 2014
vor 9 Jahren

Jetzt dämmert es - glaube ich:

Die Sortierung nach SpA erfolt nach dem Kriterium, welche SpA das kleinste Datum hat d.h. das kleinste Datum innerhalb der SpA-Gruppe bestimmt die Reihenfolge der der SpA-Sortierung, richtig? Und dann ist das auch schon die Lösung: Group by und ein geschachtelter Select:

Zunächst musst Du die Sortierordnung für SpA ermitteln. Das geht so:

select
	 SpA
	,min(Zugriff) as MinZugriff
from
	[dbo].[Table_1]
group by
	SpA

Das ist jetzt noch nicht sortiert, muss es an dieser Stelle aber noch nicht, denn wir sind ja noch nicht fertig.

Dieses Ergebnis musst Du nun noch mit den restlichen Datensätzen joinen:


select
	 t.ID
	,t.SpA
	,t.Zugriff
from
(
select
	 SpA
	,min(Zugriff) as MinZugriff
from
	[dbo].[Table_1]
group by
	SpA
) m
inner join [dbo].[Table_1] t on
	m.SpA = t.SpA
order by
	 MinZugriff
	,t.SpA
	,Zugriff

Et voila ..

B
BeZi Themenstarter:in
153 Beiträge seit 2007
vor 9 Jahren

TOP, echt Top 'mec'. Es funktioniert 😉

Was Farben so alles ausmachen können 😁

Fettes Merci

B
BeZi Themenstarter:in
153 Beiträge seit 2007
vor 9 Jahren

Hi Mec (oder wer auch immer antworten will 😁 )
Hätte da nochmal eine Frage

wenn ich das ganze jetzt Abbilden will in Anwedung auf eine DataTabel und noch eine weiter Spalte hinzufüge und das endergebnis soll so aussehen:

ID | SpA | SpB | Zugriff

6 | I | B | 01.01.2000 <--> Block B - kleinstes Datum von B (B kommt vor C) (I ist Aber vor K

2 | I | B | 01.01.2001 <--> Block B
3 | I | B | 01.01.2002 <--> Block B - größtes Datum B
4 | I | C | 01.01.2000 <--> Block C - 2. Block C kommt aber nach B beginnend mit kleinstem Datum
7 | I | C | 01.01.2001 <--> Block C
5 | I | A | 01.01.2003 <--> Block A - kleinstes Datum von A (liegt aber hinter kleinstem Datum von B und C
1 | I | A | 01.01.2004 <--> Block A
6 | K | B | 01.01.2001 <--> Block B - kleinstes Datum von B (B kommt vor C) (Aber ab hier mit K in SPA

2 | K | B | 01.01.2002 <--> Block B
3 | K | B | 01.01.2003 <--> Block B - größtes Datum B
4 | K | C | 01.01.2001 <--> Block C - 2. Block C kommt aber nach B beginnend mit kleinstem Datum
7 | K | C | 01.01.2002 <--> Block C
5 | K | A | 01.01.2004 <--> Block A - kleinstes Datum von A (liegt aber hinter kleinstem Datum von B und C
1 | K | A | 01.01.2005 <--> Block A

Zuerst Nach SPA und kleinstes Datum
Dann nach SPB und kleinstes Datum

Habe ein kleines Beispiel gefunden (und das stimmt nicht ganz):

| ItemName | ItemNo | ItemValue A 2 3,1 B 1 2,2 C 3 1,5 A 2 2,0 B 1 1,4 A 2 2,7 C 3 1,3 C 3 2,1 B 1 1,9 :::{style="color: blue;"} ```csharp table = table.AsEnumerable() .GroupBy(r => r.Field("ItemName")) .OrderBy(g => g.Max(r => r.Field("ItemNo"))) .SelectMany(g => g.OrderBy(r => r.Field("ItemValue"))) .CopyToDataTable(); ```
Wie sieht das Sortieren denn dann bei mir aus (mit 3 Spalten) bekomme es nicht hin....... NOOOOO 🤔
B
BeZi Themenstarter:in
153 Beiträge seit 2007
vor 9 Jahren

Habs 8)

M
19 Beiträge seit 2014
vor 9 Jahren

Oh Mann, da möchte ich dann aber auch den tatsächlichen Anwendungsfall mal bitte erfahren.

Es ist aber nix anderes als vorher. Nur mit einem Nested und einer Gruppierung mehr:


select
	 tbl.ID
	,tbl.SpA
	,tbl.SpB
	,tbl.Zugriff
from
	(
		select
			 SpA
			,min(Zugriff) as MinSpA
		from
			Table_1
		group by
			SpA
	) spa
	inner join
	(
		select
			 SpA
			,SpB
			,min(Zugriff) as MinSpB
		from
			Table_1
		group by
			 SpA
			,SpB
	) spb on
		spa.SpA = spb.SpA
	inner join Table_1 tbl on
		spb.SpA = tbl.SpA
		and
		spb.SpB = tbl.SpB
order by
	 MinSpA
	,MinSpB
	

Mal so als Tipp (keine Kritik oder Vorwurf):

Wenn Du die Problemstellung für Dich selbst (und somit natürlich auch für andere) klar formulierst, hast Du bereits die halbe Lösung.

Der erste Fall:

Die Sortierung ist nicht (wie Du eingangs geschrieben hast) Zugriff -> SpA -> Zugriff, sondern SpA -> Zugriff. Wobei SpA nicht seiner natürlichen Sortierordnung (also Alphabet oder Collation) unterliegt, sondern einer Abhängigkeit von Zugriff innerhalb seiner Gruppe. Wenn Du das so formulierst, ergibt sich der erste Teil-SQL schon fast von selbst.

Der zweite Fall:

SpA bildet eine eigene Gruppe, die nach dem ältesten Zugriff sortiert werden soll. Innerhalb dieser Gruppe bildet SpB Untergruppen, die nach dem gleichen
Schema sortiert werden sollen. Allerdings innerhalb der SpA-Gruppe, was es erforderlich macht, SpA im Group by zu berücksichtigen.
Und zu diesen Sortierungen muss ich mir dann nur noch die restlichen Daten (ID und Zugriff) aus der Tabelle holen und die order by Klausel anwenden.

So, das war SQL in Prosa. Aber die Parallelen springen doch förmlich ins Auge, oder?

Mit der Linq-Syntax stehe ich leider auf Kriegsfuss, aber das wirst Du schon hinkriegen.

So. Und wofür brauchst Du das jetzt?