AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Daten per SQL gruppieren

Ein Thema von norwegen60 · begonnen am 8. Apr 2017 · letzter Beitrag vom 10. Apr 2017
 
nahpets
(Gast)

n/a Beiträge
 
#19

AW: Daten per SQL gruppieren

  Alt 10. Apr 2017, 15:03
Irgendwie hat es mich gereizt.

Keine Ahnung ob brauchbar, getestet mit FireBird, dürfte aber auf andere Datenbanken übersetzbar sein.
SQL-Code:
select SerNr, Typ, Status, Anzahl from
(
  select SerNr, BisNr, Typ, Status,
    Cast(SubString(BisNr from 2 for 10) as Integer) - Cast(SubString(SerNr from 2 for 10) as Integer) As Anzahl
  from
  (
    select Min(SerNr) As SerNr, BisNr, Typ, Status from
    (
      select SerNr, Typ, Status,
        /* Unter Oracle wäre das nvl, bei MSSQL dürfte es IsNull sein. */
        /* Beim letzten Satz fehlt uns die BisNr für die Anzahlberechnung. */
        /* Daher wird hier die folgende "Krücke" benötigt. */
        /* Schön und / oder gar elegant ist was vollkommen anderes, */
        /* und durch das SubString-Gewusel wird das nícht unbedingt pflegeleicht */
        /* oder gar (welch Graus) auf andere SerNr-Arten anpassbar. */
        Coalesce((select min(b.SerNr) from norwegen60 b
                  where a.SerNr < b.SerNr
                  and ( a.Status <> b.Status
                        or a.Typ <> b.Typ
                       )
                  ),
                  /* LPAD kennt MSSQL nicht. */
                  /* Da müsste man wohl mit sowas in der Art "rumkaspern".
                  /* right(replicate('0',8) + cast(cast(SubString(max(SerNr) from 2 for 10) as Integer) + 1 as varchar(15)),8) */

                  (select 'F'||lpad(cast(SubString(max(SerNr) from 2 for 10) as Integer) + 1,8,'0') from norwegen60)
                 ) as BisNr
      from norwegen60 a
      where SerNr Between 'F05323690and 'F05323695'
    )
    group by BisNr, Typ, Status
  )
)
order by SerNr, Typ;
Ausgehend von meinen Testversuchen, sollte das Ganze nicht nur bei 'nem Statuswechsel funktionieren, sondern auch bei gleichem Status aber wechselndem Typ.

Sollte die SerNr auch mit anderen Buchstaben beginnen oder gar am Anfang mehr oder weniger viele Buchstaben enthalten, dann wird das Ganze nicht mehr wirklich witzig.

Bei ca. 10000 Sätzen in der Ausgangstabelle und ca. 3200 Sätzen im Ergebnis, benötigt das SQL ca. 4 Sekunden.
Hardware: Ein sehr in die Jahre gekommener Laptop (D810 von Dell)

Viel Vergnügen beim Testen und Auseinanderpflücken
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz