Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Leere Spalte mit den Werten aus der gleichen Tabelle füllen

  1. #1
    Ananasinka ist offline Neuer Benutzer
    Registriert seit
    23.08.2011
    Beiträge
    11

    Standard Leere Spalte mit den Werten aus der gleichen Tabelle füllen

    Hallo zusammen,

    Nachdem ich mein erstes Problem (http://www.pg-forum.de/sql/5337-sql-intersection-mit-nachfolgender-gruppierung.html) gelöst habe, habe ich nun ein nächstes

    Ich habe eine Tabelle mit insgesamt 4 Zeilen:
    distr | poskey | area | sumarea
    distrA | poskeyA | 10000 |
    distrA | poskeyB | 20000 |
    distrB | poskeyA | 30000 |
    distrB | poskeyB | 40000 |

    Die Spalte sumarea muss nun mit den Werten befüllt werden, und zwar so:
    für distrA unabhängig von poskey muss für beide Zeile die Gesamtfläche eingefügt werden (also 30000). Genauso für den distrB auch unabhängig von poskey ergibt sich die Gesamtfläche von 70000. Das Ergebnis soll dann so aussehen:
    distr | poskey | area | sumarea
    distrA | poskeyA | 10000 | 30000
    distrA | poskeyB | 20000 | 30000
    distrB | poskeyA | 30000 | 70000
    distrB | poskeyB | 40000 | 70000

    Geht es überhaupt in einem SQL-Befehl oder braucht man dafür eine Funktion?
    Wenn schon, wäre ich sehr dankbar für ein paar Tipps..

    Danke im Voraus.

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von Ananasinka Beitrag anzeigen
    Hallo zusammen,

    Nachdem ich mein erstes Problem (http://www.pg-forum.de/sql/5337-sql-intersection-mit-nachfolgender-gruppierung.html) gelöst habe, habe ich nun ein nächstes

    Ich habe eine Tabelle mit insgesamt 4 Zeilen:
    distr | poskey | area | sumarea
    distrA | poskeyA | 10000 |
    distrA | poskeyB | 20000 |
    distrB | poskeyA | 30000 |
    distrB | poskeyB | 40000 |

    Die Spalte sumarea muss nun mit den Werten befüllt werden, und zwar so:
    für distrA unabhängig von poskey muss für beide Zeile die Gesamtfläche eingefügt werden (also 30000). Genauso für den distrB auch unabhängig von poskey ergibt sich die Gesamtfläche von 70000. Das Ergebnis soll dann so aussehen:
    distr | poskey | area | sumarea
    distrA | poskeyA | 10000 | 30000
    distrA | poskeyB | 20000 | 30000
    distrB | poskeyA | 30000 | 70000
    distrB | poskeyB | 40000 | 70000

    Geht es überhaupt in einem SQL-Befehl oder braucht man dafür eine Funktion?
    Wenn schon, wäre ich sehr dankbar für ein paar Tipps..

    Danke im Voraus.
    Code:
    test=# select * from inka;
     distr  | poskey  | area  | sumarea
    --------+---------+-------+---------
     distrA | poskeyA | 10000 |
     distrA | poskeyB | 20000 |
     distrB | poskeyA | 30000 |
     distrB | poskeyB | 40000 |
    (4 rows)
    
    test=# update inka set sumarea = foo.sum from (select distr, sum(area) from inka group by distr) foo where inka.distr = foo.distr;
    UPDATE 4
    test=# select * from inka;
     distr  | poskey  | area  | sumarea
    --------+---------+-------+---------
     distrA | poskeyA | 10000 |   30000
     distrA | poskeyB | 20000 |   30000
     distrB | poskeyA | 30000 |   70000
     distrB | poskeyB | 40000 |   70000
    (4 rows)
    wäre eine von (vermutzlich) mehreren Möglichkeiten. Davon abgesehen: Du speicherst Redundanzen. Das ist Böse [tm]!


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    Ananasinka ist offline Neuer Benutzer
    Registriert seit
    23.08.2011
    Beiträge
    11

    Standard

    Vielen Dank für den Hinweis! Es funktioniert.

    Wieso speichere ich Redundanzen? Ich brauche die Spalte mit den Gesamtflächen für die Weiterverarbeitung, deswegen wollte ich diese Werte in der Tabelle festlegen und nicht jedes mal per SQL berechnen lassen.

  4. #4
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von Ananasinka Beitrag anzeigen
    Vielen Dank für den Hinweis! Es funktioniert.

    Wieso speichere ich Redundanzen? Ich brauche die Spalte mit den Gesamtflächen für die Weiterverarbeitung, deswegen wollte ich diese Werte in der Tabelle festlegen und nicht jedes mal per SQL berechnen lassen.
    Das ist redundant, weil es sich berechnen läßt. Und Du wirst es immer wieder neu berechenen UND DIE TABELLE UPDATEN MÜSSEN, wenn sich was ändert. Das ist mehrfach teuer, weil es a) Zeit kostet und b) Updates nun mal relativ großer Aufwand sind und c) die Tabelle nach INSERTS/UPDATES/DELETE in dieser Spalte falsche Werte hat.


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    Ananasinka ist offline Neuer Benutzer
    Registriert seit
    23.08.2011
    Beiträge
    11

    Standard

    Was wäre dann in meinem Fall eine günstigere Alternative?

  6. #6
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von Ananasinka Beitrag anzeigen
    Was wäre dann in meinem Fall eine günstigere Alternative?
    Den Wert dann zu berechnen, wenn man ihn real braucht.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    Ananasinka ist offline Neuer Benutzer
    Registriert seit
    23.08.2011
    Beiträge
    11

    Standard

    Hmm..

    Also. Ich habe diese Werte berechnet, um die dann im nächsten Schritt gleich wieder zu benutzen. Nächste 2 Schritte sehen dann folgendermaßen aus:
    1. Verhältnis area aus einer anderen Tabelle / sumarea
    2. Verhältnis area von poskeyB / sumarea
    Diese Werte werden dann in eine neue Tabelle geschrieben, die dann als Endergebnis dient. Alle "Zwischentabellen", u.a. auch diese mit den redundanten berechneten sumarea, werden gedroppt, da sie nicht mehr nötig sind.

    Ich brauchte diese Berechnung nur deswegen, da ich meine SQL-Abfrage einfacher gestalten wollte. Ich bin kein Profi und komme ziemlich schnell durcheinander mit mehreren Verschachtelungen.

  8. #8
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von Ananasinka Beitrag anzeigen
    Hmm..

    Also. Ich habe diese Werte berechnet, um die dann im nächsten Schritt gleich wieder zu benutzen. Nächste 2 Schritte sehen dann folgendermaßen aus:
    1. Verhältnis area aus einer anderen Tabelle / sumarea
    2. Verhältnis area von poskeyB / sumarea
    Diese Werte werden dann in eine neue Tabelle geschrieben, die dann als Endergebnis dient. Alle "Zwischentabellen", u.a. auch diese mit den redundanten berechneten sumarea, werden gedroppt, da sie nicht mehr nötig sind.

    Ich brauchte diese Berechnung nur deswegen, da ich meine SQL-Abfrage einfacher gestalten wollte. Ich bin kein Profi und komme ziemlich schnell durcheinander mit mehreren Verschachtelungen.
    *smile*

    Du könntest mit VIEWS arbeiten. Die sind recht hilfreich, um komplexe Abfragen in einfache Abfragen zu wandeln. In diesem Fall z.B. könntest Du in Deiner Tabelle diese sumarea-Spalte löschen und stattdessen ein VIEW definieren:

    Code:
    test=# select * from inka ;
     distr  | poskey  | area
    --------+---------+-------
     distrA | poskeyA | 10000
     distrA | poskeyB | 20000
     distrB | poskeyA | 30000
     distrB | poskeyB | 40000
    (4 rows)
    
    test=# create view view1 as select distr, poskey, area, sum(area) as sumarea from inka group by distr, poskey, area;
    CREATE VIEW
    test=# select * from view1;
     distr  | poskey  | area  | sumarea
    --------+---------+-------+---------
     distrA | poskeyA | 10000 |   10000
     distrA | poskeyB | 20000 |   20000
     distrB | poskeyA | 30000 |   30000
     distrB | poskeyB | 40000 |   40000
    (4 rows)
    Wann immer Du nun auf diesen Wert brauchst greifst halt auf diesen VIEW zu. Die Abfragen laufen nur dann, es ist nix redundant gespeichert und Du brauchst keine Updates auf der Tabelle machen. Außerdem sparst Du Platz auf der Platte.


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  9. #9
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    falsche Quoting-Ebene erwischt ...
    Geändert von akretschmer (24.08.2011 um 20:06 Uhr)
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  10. #10
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    *smile*

    Du könntest mit VIEWS arbeiten. Die sind recht hilfreich, um komplexe Abfragen in einfache Abfragen zu wandeln. In diesem Fall z.B. könntest Du in Deiner Tabelle diese sumarea-Spalte löschen und stattdessen ein VIEW definieren:

    Code:
    test=# select * from inka ;
     distr  | poskey  | area
    --------+---------+-------
     distrA | poskeyA | 10000
     distrA | poskeyB | 20000
     distrB | poskeyA | 30000
     distrB | poskeyB | 40000
    (4 rows)
    
    test=# create view view1 as select distr, poskey, area, sum(area) as sumarea from inka group by distr, poskey, area;
    CREATE VIEW
    test=# select * from view1;
     distr  | poskey  | area  | sumarea
    --------+---------+-------+---------
     distrA | poskeyA | 10000 |   10000
     distrA | poskeyB | 20000 |   20000
     distrB | poskeyA | 30000 |   30000
     distrB | poskeyB | 40000 |   40000
    (4 rows)
    Wann immer Du nun auf diesen Wert brauchst greifst halt auf diesen VIEW zu. Die Abfragen laufen nur dann, es ist nix redundant gespeichert und Du brauchst keine Updates auf der Tabelle machen. Außerdem sparst Du Platz auf der Platte.


    Andreas
    Autsch, deniniere den VIEW so:

    Code:
     create view view1 as select a.*, foo.sumarea from inka a left join (select distr, sum(area) as sumarea from inka group by distr) foo on (a.distr = foo.distr);

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. leere Felder oder neue Tabelle
    Von shitte im Forum Allgemeines
    Antworten: 5
    Letzter Beitrag: 09.12.2011, 14:06
  2. Problem Geometry-Spalte enthält immer die gleichen Werte
    Von hneemann im Forum PostGIS
    Antworten: 2
    Letzter Beitrag: 21.05.2011, 17:30
  3. Antworten: 11
    Letzter Beitrag: 28.02.2010, 21:50
  4. SQL - Abfrage mit mehreren gleichen Werten
    Von rs71 im Forum Andere Datenbanken
    Antworten: 15
    Letzter Beitrag: 06.03.2009, 13:58
  5. Antworten: 2
    Letzter Beitrag: 19.09.2007, 16:57

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum