![]() |
AW: Daten per SQL gruppieren
Zitat:
Übergabe sähe schematisch einmal so aus
Code:
und einmal so
Anzahl = 2
AbSerNr, Typ, Status 123456, Musteryp, S Anzahl = 1 AbSerNr, Typ, Status 123458, Musteryp, R Anzahl = 2 AbSerNr, Typ, Status 123459, Musteryp, S
Code:
Wie schon gesagt, bei dem Beispiel wäre die zweite Variante durchaus vertretbar. Druckt man aber viele Typenschilder, nervt das hin und hergeziehe und führt auch gerne zu Falten am Thermotransferband
AbSerNr, Typ
123456, Musteryp, S 123457, Musteryp, S 123458, Musteryp, R 123459, Musteryp, S 123460, Musteryp, S Mit dem SQL von Jobo sieht das Ergebnis so aus
Code:
entspricht also auch nicht dem was ich wollte. Ich schau mir aber mal die Funktion LAG an. Die kenn ich nämlich noch nicht
F05323690 MLC10U100 S 2
F05323691 MLC10U100 S 1 F05323692 MLC10U100 R 2 F05323693 MLC10U100 S 2 F05323694 MLC10U100 S 1 |
AW: Daten per SQL gruppieren
Mein Ergebnis
mit diesem Select Zitat:
sieht so aus Zitat:
![]() |
AW: Daten per SQL gruppieren
Hallo Jo,
ich denke die Ursache ist einfach zu erkären. Ich denke du gehst davon aus, dass es F05323692 nur mit Status R gibt. Real gibt es ihn mind. zwei mal. Den ursprünglichen Datensatz bei Auslieferung mit Status S und dann ein- oder mehrfach als Repaartur mit Status R. Beachtet werden soll aber nur der letzte, aktuellste Datensatz Ändere ich das SQL auf
Code:
funktioniert es mit dem SQL auch.
SELECT SerNr, Typ, Status,
case when LAG(status,1,'R') OVER(ORDER BY SerNR) = status then LAG(SerNR) OVER(ORDER BY SerNR) else serNr end AS GroupedSerNr FROM (select * from Ser_nr where ID in (SELECT Max(S1.ID) AS MaxID FROM Ser_Nr AS S1 WHERE s1.SerNr BETWEEN 'F05323690' AND 'F05323694' GROUP BY S1.SerNr)) y ) x group by GroupedSerNr, Typ, Status order by GroupedSerNr
Code:
Erweitere ich aber den Ser-Nr. Bereich z.B. auf BETWEEN 'F05323690' AND 'F05323700' sieht das Ergebnis so aus
F05323690 MLC10U100 S 2
F05323692 MLC10U100 R 1 F05323693 MLC10U100 S 2
Code:
Korrekt wäre
F05323690 MLC10U100 S 2
F05323692 MLC10U100 R 1 F05323693 MLC10U100 S 2 F05323694 MLC10U100 S 1 F05323695 MLC10U100 S 1 F05323696 MLC10U100 S 1 F05323697 MLC10U100 S 1 F05323698 MLC10U100 S 1 F05323699 MLC10U100 S 1 F05323700 MLC10U100 S 1
Code:
F05323690 MLC10U100 S 2
F05323692 MLC10U100 R 1 F05323693 MLC10U100 S 8 |
AW: Daten per SQL gruppieren
Zitat:
U.U. ist es möglich über die ID eine zeitliche Abfolge zu rekonstruieren, aber solche Ergebnisse über Bande sind meiner Meinung nach nicht sehr zuverlässig. Gruß K-H |
AW: Daten per SQL gruppieren
Zitat:
Dass die Erweiterung auf größere Folgen nicht klappt war mir nicht aufgefallen. Blöd. Dazu fällt mir spontan auch keine Lösung ein, weil es nach meinem Kenntnisstand keine Konstruktion in SQL Server gibt, die eine autarke Wertefolge unabhängig von irgendwelchen Randbedingungen produziert. Also auf Deutsch eine normale Sequenz gibt es leider nicht. Damit wär es m.E. gelöst. Wahrscheinlich kann man auch mit rekursiven Queries was machen oder irgendwelchen Workarounds dafür, aber dazu hatte ich noch keine Lust. |
AW: Daten per SQL gruppieren
Himitsu hat doch eigentlich den richtigen Ansatz schon gesagt.
Eine Function sollte das Problem relativ einfach beheben. Ich habe mal was auf die Schnelle gebastelt:
Code:
Ich habe das jetzt ohne Parameter gemacht. Daher fehlt im Cursor noch die Einschränkung auf den gewünschten Bereich.
CREATE FUNCTION dbo.f_SerNr (
) RETURNS @Etiketten TABLE ( SerNr varchar(10), Typ varchar(10), Status char(1), Anzahl int ) AS BEGIN declare @SerNr varchar(10), @SerNr_1 varchar(10), @Typ varchar(10), @Status char(1), @Typ_1 varchar(10), @Status_1 char(1), @Anzahl int declare SN_Cursor Cursor for select * from Ser_Nr order by SerNr; open SN_Cursor fetch next from SN_Cursor into @SerNr, @Typ, @Status set @Anzahl = 1 while @@FETCH_STATUS = 0 begin fetch next from SN_Cursor into @SerNr_1, @Typ_1, @Status_1 if (@Typ = @Typ_1) and (@Status = @Status_1) and (@@FETCH_STATUS = 0) BEGIN set @Anzahl = @Anzahl + 1 end else begin insert @Etiketten values (@SerNr, @Typ, @Status, @Anzahl) set @SerNr = @SerNr_1 set @Typ = @Typ_1 set @Status = @Status_1 set @Anzahl = 1 end end close SN_Cursor; DeAllocate SN_Cursor; return end Ich denke, dass die paar Ergänzungen aber kein Problem darstellen sollten. |
AW: Daten per SQL gruppieren
Zitat:
Ein Select würde ich immer einer SP vorziehen, wenn es geht und performant genug ist. Daher war das Select Statement mein Ansatz. Da ja auch ebenso auch eine clientseitige Lösung im Raum steht, mit der man es analog zu einer SP machen kann, habe ich das nicht betrachtet. Ein elegantes Select reizt mich da mehr. Dass einem dabei offenbar die Einschänkungen der SQL Server Sequenzimplemntierung in die Hacken laufen, habe ich nicht geahnt. |
AW: Daten per SQL gruppieren
Zitat:
Ein schönes SQL bevorzuge ich auch, aber es gibt Grenzen. Zumal im professionellem Umfeld auch Zeit eine große Rolle spielt. Zitat:
Die kann dir sowas liefern. Allerdings ist die auf 2048 Werte beschränkt. Der Thread-Ersteller schrieb, dass das bis zu 2000 Einträge werden können und ist damit dicht an der Grenze. Ich habe die Tabelle auch schon genutzt mit einen fortlaufenden Datumswert zu generieren. Beispiel:
Code:
Vielleicht kannst du damit ja noch was elegantes zaubern :wink:
SELECT DATEADD(Day, Number, '01.' + CAST(MONTH(@StartDatum) AS VARCHAR) + '.' + CAST(YEAR(@StartDatum) AS VARCHAR)) as Datum
FROM master..spt_values WHERE Type='P' AND DATEADD(day, Number, @StartDatum) <= @EndeDatum |
AW: Daten per SQL gruppieren
Ok, SP oder UDF, unter dem Aspekt der Wartbarkeit, Komplexität, wie gesagt lieber SQL-natürlich performant, das wäre ja mit Window Functions erstmal zu erwarten.
Die SPT_VALUES ist ja offenbar auch fragwürdig. Zu "elegant" könnte man ja auch "dokumentiert" und "zuverlässig" zählen. Aber so eine alte Sybase System Tabelle, die knapp am Rangelimit ist, kann man nicht wirklich elegant nennen. Dann lieber Deine Lösung. |
AW: Daten per SQL gruppieren
Ich würde eine Lösung über den Delphi Client bevorzugen, da SQL von Haus aus für Mengen und nicht für (sortierte) Folgen gemacht ist. Im Client kann ich die Abfolge der Daten problemlos berücksichtigen. das Problem jetzt mit SQL zu lösen mag zwar reizvoll sein, aber meiner Meinung nach ist das ineffizient.
Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz