Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

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

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

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    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);
    Ohh.. Hat geklappt, jetzt muss ich das alles aber erst verstehen, bevor ich das weiter nutze

    Ich danke dir tausend mal, Andreas, und komme bestimmt morgen mit neuen Fragen wieder *peinlich*

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

    Standard

    Neuer Tag, neues Problem..

    Wie ich schon gestern gesagt habe, brauchte ich die Spalte mit den Summen, um dann weitere Analyse durchführen zu können. Nun ist es soweit. Ich habe eine Tabelle, in die bestimmte Werte (als varchar) eingefügt werden müssen, je nachdem, wie das Ergebnis einer mathematischen Operation in einer anderen Tabelle aussieht.

    Ein Beispiel:

    Code:
    test=# update inka set sumarea = foo.sum from (select distr, sum(area) from inka group by distr) foo where inka.distr = foo.distr;  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)
    
    test=# select * from tabelle2;  
    distr  | bewertung    
    -------+---------  
    distrA |    
    distrB |     
    distrB |    
    distrC |    
    (4 rows)
    Die Spalte bewertung der Tabelle tabelle2 sollte jetzt folgendermaßen gefüllt werden:
    Falls area/sumarea*100<10, dann bewertung=schlecht.
    Falls area/sumarea*100>10 und area/sumarea*100<50, dann bewertung=gut.
    Anderfalls bewertung=super.

    Ich dachte, dass ich die Anfrage mit dem CASE lösen kann, sodass es dann ungefähr so aussieht:
    Code:
    UPDATE tabelle2 SET bewertung=
    SELECT (CASE
    WHEN area/sumarea*100<10 THEN 'schlecht'
    WHEN area/sumarea*100>10 AND area/sumarea<50 THEN 'gut'
    ELSE 'super'
                END)
    FROM inka)
    WHERE distr = 'distrA';
    Aber ich bekomme Fehlermeldung "als Ausdruck verwendete Unteranfrage ergab mehr als eine Zeile". Mir ist klar, dass ich offenbar in meinem SELECT kein CASE benutzen darf. Die Frage ist, wodurch kann ich CASE ersetzen, damit die Anfrage funktioniert?

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

    Standard

    Zitat Zitat von Ananasinka Beitrag anzeigen
    Neuer Tag, neues Problem..

    Wie ich schon gestern gesagt habe, brauchte ich die Spalte mit den Summen, um dann weitere Analyse durchführen zu können. Nun ist es soweit. Ich habe eine Tabelle, in die bestimmte Werte (als varchar) eingefügt werden müssen, je nachdem, wie das Ergebnis einer mathematischen Operation in einer anderen Tabelle aussieht.

    Ein Beispiel:

    Code:
    test=# update inka set sumarea = foo.sum from (select distr, sum(area) from inka group by distr) foo where inka.distr = foo.distr;  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)
    
    test=# select * from tabelle2;  
    distr  | bewertung    
    -------+---------  
    distrA |    
    distrB |     
    distrB |    
    distrC |    
    (4 rows)
    Die Spalte bewertung der Tabelle tabelle2 sollte jetzt folgendermaßen gefüllt werden:
    Falls area/sumarea*100<10, dann bewertung=schlecht.
    Falls area/sumarea*100>10 und area/sumarea*100<50, dann bewertung=gut.
    Anderfalls bewertung=super.

    Ich dachte, dass ich die Anfrage mit dem CASE lösen kann, sodass es dann ungefähr so aussieht:
    Code:
    UPDATE tabelle2 SET bewertung=
    SELECT (CASE
    WHEN area/sumarea*100<10 THEN 'schlecht'
    WHEN area/sumarea*100>10 AND area/sumarea<50 THEN 'gut'
    ELSE 'super'
                END)
    FROM inka)
    WHERE distr = 'distrA';
    Aber ich bekomme Fehlermeldung "als Ausdruck verwendete Unteranfrage ergab mehr als eine Zeile". Mir ist klar, dass ich offenbar in meinem SELECT kein CASE benutzen darf. Die Frage ist, wodurch kann ich CASE ersetzen, damit die Anfrage funktioniert?
    Mach mal bitte bei einer neuen Frage auch einen neuen Thread auf.

    Code:
    test=# select * from s1;
     distr  | sumarea
    --------+---------
     distrA |   30000
     distrB |   70000
    (2 rows)
    
    Time: 0,165 ms
    test=*# select * from s2;
     distr  | bewertung
    --------+-----------
     distrA |
     distrB |
     distrC |
    (3 rows)
    
    Time: 0,244 ms
    test=*# update s2 set bewertung = (select case when sumarea > 50000 then 'gut' else 'schlecht' end from s1 where s1.distr=s2.distr);
    UPDATE 3
    Time: 0,320 ms
    test=*# select * from s2;
     distr  | bewertung
    --------+-----------
     distrA | schlecht
     distrB | gut
     distrC |
    (3 rows)
    
    Time: 0,204 ms
    Reicht das als Anregung?

    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

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

    Standard

    Mein Code:
    Code:
    UPDATE tabelle2 
    SET bewertung= (SELECT 
    CASE WHEN area/sumarea*100<10 THEN 'schlecht' 
    WHEN area/sumarea*100>10 AND area/sumarea<50 THEN 'gut' 
    ELSE 'super'             
    END FROM inka) 
    WHERE distr = 'distrA';
    Dein Code:
    Code:
    update s2 set bewertung = (select case when sumarea > 50000 then 'gut' else 'schlecht' end from s1 where s1.distr=s2.distr);
    Leider habe ich immer noch die Fehlermeldung wegen mehrzeiliger Unteranfrage.

    Der Abschnitt s1.distr= s2.distr passt mir nicht, da für den distrB der Attribut "bewertung" anders berechnet wird, als für den distrA. Deswegen steht bei mir WHERE außerhalb von Klammern und bezieht sich auf die Tabelle2, die updatet werden muss.

    UPDATE:

    Ich habe jetzt versucht, die Abfrage genauso durchzuführen, wie Du es vorschlägst, alles bis zum letzten Buchstaben gleich - immer noch erfolglos und mit gleicher Fehlermeldung.
    Der einzige Unterschied ist, dass die s1 in meinem Fall keine Tabelle ist, sondern ein View (von gestern), alles andere ist gleich.
    Geändert von Ananasinka (25.08.2011 um 11:22 Uhr)

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

    Standard

    Problem gelöst!
    SELECT vor dem CASE musste weg.


    Code:
    UPDATE tabelle2  SET bewertung= 
    CASE 
      WHEN area/sumarea*100<10 THEN 'schlecht'
      WHEN area/sumarea*100>10 AND area/sumarea<50 THEN 'gut'  
      ELSE 'super'              
    END 
    FROM inka
      WHERE tabelle2.distr = 'distrA';

  6. #16
    Gisman ist offline Erfahrener Benutzer
    Registriert seit
    20.01.2006
    Ort
    Pfalz
    Beiträge
    794

    Standard

    Hallo!

    Solange du nur die Werte als sum brauchst, würde ich das über einen View oder im SQL abfragen und kein Extra-Feld anlegen. Wenn du aber die vereinigten Geometrien (die ja auch mal im Spiel waren WIMRE) dazu brauchst, wäre eine Tabelle oder ein Materialized View besser, weil st_union u.U. recht teuer ist. Da ist dann auch die Redundanz egal...

    Gruß Uwe
    Have a lot of fun!

Seite 2 von 2 ErsteErste 12

Ä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