Announcement

Collapse
No announcement yet.

Stored Procedure: Reihenfolge neu nummerieren

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

  • Stored Procedure: Reihenfolge neu nummerieren

    Hallo

    Ich habe eine Tabelle, wo in einer Spalte eine Nummerierung steht:
    col1
    -----
    5
    10
    10.1
    20.3
    90
    95

    Die Abfrage der Posnummer ist:
    select a.pos from auftr_pos a where a.Auftrnr = 'AG 200397'
    ORDER BY dbo.udf_SortedPosnum(a.Pos,'0')

    Die Function fügt führende Nullen hinzu, damit die Sortierung richtig ist, da a.Pos Text und nicht Nummer ist

    Ich möchte nun gerne die oben genannte Liste neu sortieren und zwar 10er Einheiten aufsteigend:
    col1
    -----
    10
    20
    30.1
    40.3
    50
    60

    Es muss also gesplittet werden "." und dann den linken Teil hochzählen.

    Kann mir jemand bei dieser schwierigen Aufgabe helfen?

    Danke!

  • #2
    Aufgrund der UDF vermute ich mal, dass es sich um den SQL-Server handelt. Da könnte das zB so aussehen:
    Code:
    declare @tmp table (pos varchar(9))
    insert into @tmp values('5')
    insert into @tmp values('10')
    insert into @tmp values('10.1')
    insert into @tmp values('20.3')
    insert into @tmp values('90')
    insert into @tmp values('95')
    
    select cast(row_number() over (order by pos) * 10 as varchar) + 
    case when CHARINDEX('.', pos) > 0 then SUBSTRING(pos, CHARINDEX('.', pos), 99) else '' end
    from @tmp
    Das ist ein funktionierendes Beispiel ab SQL Server 2005. Vorher gab's noch keine row_number.

    Bei dir müsste das dann etwa so aussehen:
    Code:
    select cast(row_number() over (ORDER BY dbo.udf_SortedPosnum(a.Pos,'0') ) * 10 as varchar) + 
    case when CHARINDEX('.', a.Pos) > 0 then SUBSTRING(a.Pos, CHARINDEX('.', pos), 99) else '' end from auftr_pos a where a.Auftrnr = 'AG 200397'
    ORDER BY dbo.udf_SortedPosnum(a.Pos,'0')
    ... kann natürlich noch fehlerhaft sein ...

    bye,
    Helmut

    PS: verrate doch mal deine Datenbank (inkl. Version)

    Comment


    • #3
      Hallo Helmut

      Danke für die schnelle Antwort.

      Es ist eine SQL Datenbank. Die Version kann ich aktuell nicht nachschlagen.
      Denk aber 2008.

      Danke!

      Comment


      • #4
        Na dann sollte es ja funtionieren

        bye,
        helmut

        Comment


        • #5
          Nochmal Hallo

          Habs nun auf:
          SET ANSI_NULLS ON
          SET QUOTED_IDENTIFIER ON
          GO

          CREATE PROCEDURE dbo.CalculateRowNumbers(@aid nvarchar(50))
          AS
          BEGIN
          select cast(row_number() over (ORDER BY dbo.udf_SortedPosnum(a.Pos,'0') ) * 10 as varchar) +
          case when CHARINDEX('.', a.Pos) > 0 then SUBSTRING(a.Pos, CHARINDEX('.', pos), 99) else '' end from AUFTR_POS a where a.Auftrnr = @aid
          ORDER BY dbo.udf_SortedPosnum(a.Pos,'0')
          END

          Abgeändert und er zeigt mir das richtige Ergebnis an.

          Nun müsste ich aber auf die entsprechenden Positionen das Update anwenden, damit diese aktualisiert werden.

          Ob ich nochmals um Hilfe bitte dürfte?

          Danke!

          Comment


          • #6
            Ich würde das mit einer Hilfstabelle machen, in der ich alten und neuen Wert eintrage und dann damit updaten, zB so:
            Code:
            -- das hier ist nur für die Testdaten
            declare @tmp table (pos varchar(9))
            insert into @tmp values('5')
            insert into @tmp values('10')
            insert into @tmp values('10.1')
            insert into @tmp values('20.3')
            insert into @tmp values('90')
            insert into @tmp values('95')
            
            -- das ist die Hilfstabelle
            declare @hilfe table (alt varchar(9), neu varchar(9))
            
            -- Hilfstabelle füllen
            insert into @hilfe select pos, cast(row_number() over (order by pos) * 10 as varchar) + 
            case when CHARINDEX('.', pos) > 0 then SUBSTRING(pos, CHARINDEX('.', pos), 99) else '' end
            from @tmp
            
            -- Update machen
            update @tmp set pos = (select neu from @hilfe where alt = pos)
            ... das kannst du so mal probieren und dann musst du es nur mehr auf deine Tabelle umbauen und die Auftragsnummer berücksichtigen.

            bye,
            helmut

            Comment


            • #7
              Hallo

              Meinst du das so?:
              Code:
              SET ANSI_NULLS ON
              SET QUOTED_IDENTIFIER ON
              GO
              
              CREATE PROCEDURE dbo.CalculateRowNumbers(@aid nvarchar(50))
              AS
              BEGIN
              -- das ist die Hilfstabelle
              declare @hilfe table (alt varchar(9), neu varchar(9))
              
              -- Hilfstabelle füllen
              insert into @hilfe select pos, cast(row_number() over (ORDER BY dbo.udf_SortedPosnum(a.Pos,'0') ) * 10 as varchar) + 
              case when CHARINDEX('.', a.Pos) > 0 then SUBSTRING(a.Pos, CHARINDEX('.', pos), 99) else '' 
              end from AUFTR_POS a where a.Auftrnr = @aid
              ORDER BY dbo.udf_SortedPosnum(a.Pos,'0')
              
              -- Update machen
              update AUFTR_POS set pos = (select neu from @hilfe where alt = pos) where a.Auftrnr = @aid
              END
              Ich bin mir nur nicht sicher beim update. Sollte hier nicht auch nur das Update auf den Auftrag bezogen werden?
              Sonst updated er mir ja auch Positionen eines anderen Auftrages, oder?
              habe deswegen noch das WHERE eingebaut.

              Bevor ich es teste wäre eine Meinung von Euch mir noch wichtig. Danke!

              Comment


              • #8
                Wenn eine alte Positionsnummer in mehreren Aufträgen vorkommen kann und daher nicht eindeutig ist, musst du natürlich beim Update die Auftragsnummer ebenfalls mit berücksichtigen, das WHERE ist also völlig richtig von dir eingebaut worden :-)

                bye,
                Helmut

                Comment

                Working...
                X