Announcement

Collapse
No announcement yet.

Komplexe T-SQL Abfrage

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Komplexe T-SQL Abfrage

    Huhu Zusammen,

    ich bin gerade dabei mich in T-SQL einzuarbeiten. Einfachere bis normale Prozeduren kann ich inzwischen recht gut in T-SQL abbilden, doch eine Aufgabenstellung bereitet mir Kopfzerbrechen

    Ich habe eine Taballe (Abstrakte Version)
    ID - Titel - Kategorie - Datum - Status

    Es gibt eine Handvoll fest definierte Kategorien in der Tabelle mit beliebigen Titeln. Nun möchte ich pro Kategorie den kompletten Datensatz mit dem nächsten Datum (von heute aus).

    Ich habe bereits selbst versucht die Aufgabe zu lösen, aber mit GroupBy auf die Kategorie, der Where-Klausel Datum > Heute und der Aggregatsfunktion min() auf das Datum komme ich nicht weiter, da der Datensatzbezug auf die Spalten Titel, ID und Status verloren geht, die ja auch mit ausgebene werden sollen.

    Ich verwende einen MS SQL Server 2008 R2.

    Vieleicht kann mir jemand von euch einen Dankanstoss geben. Vielen Dank und liebe Grüße
    Thomas K.

  • #2
    etwa so (Annahme kategorie ist varchar, sonst auch casten):

    select * from tabelle where kategorie + '_' + cast(id as varchar) in
    (select kategorie + '_' + cast(min(id) as varchar) from tabelle
    where datum > heute group by kategorie)

    bye,
    Helmut

    Comment


    • #3
      Glaube Du meinstet das "näheste" Datum und es soll pro Kategorie nur ein Datensatz zurückkommen, richtig?

      Dann würde ich mir ne Function bauen, ist einfacher zu händeln und auch zu verstehen...

      ungetestet:
      Code:
      create function dbo.Get_NextKategorieDate
      (@KategorieID int, @DatumAb datetime) -- Datentyp anpassen
      returns datetime
      as
      begin
      declare @fn_return datetime
      
      select top 1
      @fn_return = datum
      from Tabelle
      where Kategorie = @KategorieID and Datum > DatumAb
      order by datum ASC
      
      return @fn_return
      
      end
      Dann sollte man das näheste Datum der Liste jeder Kategorie bekommen.

      Dann der Select ca. so, auch ungetestet:
      Code:
      declare @heute datetime; set @heute = getdate()
      select * from Tabelle inner join (select kategorie, dbo.Get_NextKategorieDate
      (Kategorie, @heute) as datum from Tabelle group by kategorie) as Tabelle2 on tabelle2.kategorie = tabelle.kategorie and tabelle2.datum = tabelle.datum
      Gruß
      Thomas

      Comment

      Working...
      X