Announcement

Collapse
No announcement yet.

Ein Update in der gleichen Tabelle soll Daten zusammenfassen

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

  • Ein Update in der gleichen Tabelle soll Daten zusammenfassen

    Hallo,

    ich habe eine Tabelle hours mit den Spalten:
    date, user, location, project, type, hours

    Die Felder date, user, location, project, type sind primary key Felder.

    Jetzt habe ich das Problem das z.B. 8 verschiedene types in der Tabelle sind, diese nun aber auf 4 Stück reduziert werden sollen:
    1.1.2010, usera, locationa, projecta, typea, 5
    1.1.2010, usera, locationa, projecta, typeb, 2
    1.1.2010, usera, locationa, projectb, typea, 2
    1.1.2010, usera, locationa, projectb, typeb, 8

    Jetzt soll z.B. der Type typeb abgeschaft werden und alle Stunden, die auf diesen Type kontiert waren sollen auf den typea auf addiert werden.
    1.1.2010, usera, locationa, projecta, typea, 7
    1.1.2010, usera, locationa, projectb, typea, 10

    Ich dachte mir, ich mach ein update Kommando mit einem INNER JOIN auf die gleiche Tabelle und addiere die Werte entsprechend auf, anschliessen lösche ich mit einem DELETE die alten Werte aus der Tabelle raus. (ein normales Update geht ja nicht, weil ich eine Kombination aus mehreren primary keys habe)

    Ich hatte das folgende Kommando im Kopf:
    Code:
    UPDATE hours
    SET hours=hours + b. hours
    FROM hours AS a INNER JOIN
        hours AS b ON a.date=b.date AND a.user=b.user
        AND a.location=b.location AND a.project=b.project
    WHERE a.type='typea' AND b.type='typeb'
    Wenn ich das versuche, bekomme ich allerdings die Fehlermeldung:
    The table 'hours' is ambigous.

    Hat hier vllt. jemand eine Idee, wie man ein solches Update machen könnte?

    Gruss
    Matthias

  • #2
    Probiere es mal so:
    Code:
    UPDATE hours
    SET hours = hours + (select b.hours
    FROM hours b where a.date=b.date AND a.user=b.user
        AND a.location=b.location AND a.project=b.project
        AND b.type='typeb')
    from hours a
    WHERE a.type='typea'
    ... natürlich ungetestet ...

    bye,
    Helmut

    Comment


    • #3
      vielen Dank Helmut, machmal sieht man den Wald echt vor lauter Bäumen nicht mehr.
      Hab es noch ein bischen modifiziert:
      Code:
      UPDATE hours
      SET hours = hours + ISNULL((select b.hours
      FROM hours b where a.date=b.date AND a.user=b.user
          AND a.location=b.location AND a.project=b.project
          AND b.type='typeb'),0)
      from hours a
      WHERE a.type='typea'
      Damit kracht es mal nicht, wenn er keinen Datensatz im sub-select findet.

      Gruss
      Matthias

      Comment

      Working...
      X