none
Zeilennumer in ein Feld schreiben RRS feed

  • Frage

  • Hallo

    Ich habe eine Anfängerfrage. Mit rank() kann eine Tabelle durchnummeriert werden.

    Nun habe ich eine bestehende Tabelle mit mehreren Verkäufern. Eine Spalte nennt sich Verkäufernummer. Nun möchte ich in dieser Spalte jeweils die entsprechende Zeilennummer einfügen.

    Bsp.

    Verkäufer Verkäufernr.
    aldi  1
    lidl 2
    coop 3

    Die werte müssen nicht sortiert werden, ich brauche lediglich eine fortlaufende Nummer in einer bestehenden Spalte.

    Wie mache ich einen solchen Eintrag am einfachsten per SQL?

    Danke und Gruss

    Wili

     

    Montag, 27. Juni 2011 10:27

Antworten

  • Hallo Wili, für mein kleines Beispiel habe ich mal Row_Number bemüht:

    Declare @test table(Verkaeufer varchar(10), Nr integer);
    
    Insert into @test(Verkaeufer) values ('abc');
    Insert into @test(Verkaeufer) values ('abd');
    Insert into @test(Verkaeufer) values ('cde');
    
    update @test
    set Nr = x.rrn
    from
    @test t
    inner join
    (Select Verkaeufer, Row_number() over(order by Verkaeufer) as rrn
    from @test) x
    on t.Verkaeufer = x.Verkaeufer;
    
    Select *
    from @test
    order by Verkaeufer ;

    Einen schönen Tag noch,
    Christoph


    Microsoft SQL Server MVP
    http://www.insidesql.org/blogs/cmu

    Montag, 27. Juni 2011 10:41
  • Z.B. mit einer Common Table Expression:

    DECLARE @Sample TABLE
      (
       Employee VARCHAR(32) ,
       NoEmployee INT
      ) ;
    
    INSERT INTO @Sample
    VALUES ( 'aldi', 0 ),
        ( 'lidl', 0 ),
        ( 'coop', 0 ) ;
    
    WITH  CTE
         AS ( SELECT  * ,
                ROW_NUMBER() OVER ( ORDER BY Employee ) AS RN
            FROM   @Sample
           )
      UPDATE C
      SET   NoEmployee = RN
      FROM  @Sample S
          INNER JOIN CTE C ON S.Employee = C.Employee ;
    
    SELECT *
    FROM  @Sample ; 

    Wobei dein Sortierkriterium und Join-Bedingung ein Kandiatenschlüssel sein sollten.


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Montag, 27. Juni 2011 10:36
    Moderator

Alle Antworten

  • Z.B. mit einer Common Table Expression:

    DECLARE @Sample TABLE
      (
       Employee VARCHAR(32) ,
       NoEmployee INT
      ) ;
    
    INSERT INTO @Sample
    VALUES ( 'aldi', 0 ),
        ( 'lidl', 0 ),
        ( 'coop', 0 ) ;
    
    WITH  CTE
         AS ( SELECT  * ,
                ROW_NUMBER() OVER ( ORDER BY Employee ) AS RN
            FROM   @Sample
           )
      UPDATE C
      SET   NoEmployee = RN
      FROM  @Sample S
          INNER JOIN CTE C ON S.Employee = C.Employee ;
    
    SELECT *
    FROM  @Sample ; 

    Wobei dein Sortierkriterium und Join-Bedingung ein Kandiatenschlüssel sein sollten.


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Montag, 27. Juni 2011 10:36
    Moderator
  • Hallo Wili, für mein kleines Beispiel habe ich mal Row_Number bemüht:

    Declare @test table(Verkaeufer varchar(10), Nr integer);
    
    Insert into @test(Verkaeufer) values ('abc');
    Insert into @test(Verkaeufer) values ('abd');
    Insert into @test(Verkaeufer) values ('cde');
    
    update @test
    set Nr = x.rrn
    from
    @test t
    inner join
    (Select Verkaeufer, Row_number() over(order by Verkaeufer) as rrn
    from @test) x
    on t.Verkaeufer = x.Verkaeufer;
    
    Select *
    from @test
    order by Verkaeufer ;

    Einen schönen Tag noch,
    Christoph


    Microsoft SQL Server MVP
    http://www.insidesql.org/blogs/cmu

    Montag, 27. Juni 2011 10:41
  • Vielen Dank für die prompten Antworten

    Noch als Ergänzug. Die bestehende Tabelle hat über 3000 Zeilen und ich möchte den Befehl gleich im Microsoft SQL Server Studio ausführen.

    Das heisst ich kann gleich auf die bestehende Tabell zugreifen, z.b.:

    update

    [mydb].[dbo].[Vendor]

    set

    Nr = x.rrn

    from

    [myDB]

    .[dbo].[Vendor] v
     

    inner

    join

    (

    Select [part number], Row_number() over(order by [part number]) as rrn

    from

    [myDB].[dbo].[Vendor]) x

    on

    v.[vendornumber] = x.[part number]

    ;

    Jedoch läuft der zweite Vorschlag nicht durch, ich habe Probleme mit dem set Nr=x.rrn. Ich erhalte jeweils folgende Fehlermeldung:

    Msg 207, Level 16, State 1, Line 3
    Invalid column name 'Nr'.

     

    Was mache ich falsch?

     

    Danke und Gruss

    Montag, 27. Juni 2011 11:03
  • Das Nr. Problem habe ich gelöst.

    Wenn ich im mircosoft SQL Server diese Abfrage nu ausführe, dann heisst es jeweils "0 row affected".

    Das heisst es wurde keine Änderung durchgeführt. Kann man nicht gleich eine Query im Microsoft SQL Server Managemant Studio ausführen, welche gleich die Werte in einer bestehenden Tabelle ändert?

    In einer Excel Tabelle würde man einfach in einer Spalte die ersten paar Zeilen mit Nummern füllen und anschliessen kann diese fortlaufende Nummerierung für die ganze Spalte erweitert werden.

    Gibt es keine Funktion, die das auch bei SQL Tabellen anwendet?

    Montag, 27. Juni 2011 11:14
  • Entweder heißt die Spalte anders, oder der eigentliche Fehler liegt in der falschen Schreibweise von ORDER BY (orderby)! ? !

    Einen schönen Tag noch,
    Christoph


    Microsoft SQL Server MVP
    http://www.insidesql.org/blogs/cmu

    Montag, 27. Juni 2011 11:47
  • Meinst Du so etwas wie IDENTITY?

    Einen schönen Tag noch,
    Christoph


    Microsoft SQL Server MVP
    http://www.insidesql.org/blogs/cmu

    Montag, 27. Juni 2011 13:48