Anzeigen bestimmter Spalten nach bestimmten Bedingungen

Hab ein Problem ich will das alle Firmen angezeigt deren Bestellung noch nicht geliefert wurden.

hierzu die Tabelle:

aufstat(Auftragsstatus): status: 0 , 1 , 2 , 3
status_txt: erfasst , bestätigt , fakturiert . geliefert

aufkopf(Auftragskopf): aufnr: 1, 2, 3 , 4, 5, 6
kdnr: 500,600,900,700,100,100
status: 3,1,2,2,0,null

aufpos(Auftragsposition): aufnr; posnr;menge,artnr,preis (nur die Spalten)

kdst(Kundenstamm): Firma, Kdnr, Saldo,

artst(Artikelstamm): artnr, artbez,ekpreis,vpreis

dazu habe ich erstmal das hier geschrieben:

select  a.firma,b.aufnr,b.posnr,d.artnr,d.artbez,d.vpreis,  d.vpreis-d.ekpreis  as "Gewinnprostueck",b.menge,((d.vpreis-d.ekpreis)*b.menge) as  "Gesamtgewinn"
from kdst a,aufpos b,aufkopf c,artst d,aufstat e
where c.aufnr = b.aufnr
and c.kdnr = a.kdnr
and d.artnr = b.artnr
and b.aufnr = c.aufnr
and e.status = c.status
and a.firma like 'T&';
order by a.firma,b.aufnr,b.posnr

mit dem Status habe ich erstmal die beiden Spalten aus den beiden Tabellen verbunden aber weiter weiss ich nicht, wie kriege ich es hin das er nur die auflistet deren Bestellung noch nicht geliefert wurde. Ich hab da überhaupt kein Plan wie ich da anfangen soll

meine schreibweise ist zwar nicht das eleganteste bin ja auch ein anfänger aber will wenigstens ans ziel
kommen…

würde mich über eure Hilfe freuen…sitze schon seit 10stunden am PC

und bin verzweifelt

Verzweifelt?

Ich hab Deine Aufgabe (Anzeige aller Firmen wo der Auftrag nicht geleifert wurde, mehr nicht) mal realisiert. Du brauchst, für nur diese Anzeige, gar nicht alle Tabellen.

test=*# select * from aufstat ;
 status | status_text
--------+-------------
      1 | erfasst
      2 | bestätigt
      3 | fakturiert
      4 | geliefert
(4 rows)

Time: 0,247 ms
test=*# select * from aufkopf ;
 aufnr | kdnr | status
-------+------+--------
     1 |    1 |      1
     2 |    2 |      2
     3 |    3 |      3
     4 |    4 |      4
(4 rows)

Time: 0,253 ms
test=*# select * from kdst ;
 kdnr | firma
------+--------
    1 | firma1
    2 | firma2
    3 | firma3
    4 | firma4
(4 rows)
test=*# SELECT
test-#   a.aufnr,
test-#   k.firma,
test-#   s.status_text
test-# FROM
test-#   aufkopf a
test-#   LEFT JOIN kdst k ON (a.kdnr=k.kdnr)
test-#   LEFT JOIN aufstat s ON (a.status=s.status)
test-# WHERE
test-#   s.status != 4;
 aufnr | firma  | status_text
-------+--------+-------------
     1 | firma1 | erfasst
     2 | firma2 | bestätigt
     3 | firma3 | fakturiert
(3 rows)

In Deinem SQL hast Du impliziete JOINS, es ist für die Lesbarkeit besser, die JOINS direkt zu definieren.

Kommst Du nun weiter?

Hab das mit dem Status hingekriegt und die Abfrage wird so Ausgegeben wie vorgestellt , Danke

and e.stat_txt  !='geliefert';

Jetzt hänge ich an einer weiteren Stelle fest.

Sondern hab ich diesen Code schon mal geschrieben:

select p.partname,s.suppname,z.quantity      
from company.supplier s,company.supp_part z,company.part p           
where s.suppno = z.suppno                                            
and z.partno =  p.partno                                                                                                                        
order by p.partname,s.suppname

und jetzte soll unter dieser Ausgegebenen Tabelle eine Zeile frei bzw eine Leerzeile sein und das Wort " Summe: " linksbündig und das Ergebnis der Summe rechtsbündig stehen…

Ein Bild sagt mehr als Worte ^^

und das soll alles in einer Abfrage geschrieben werden. Alles schön und gut leider bin ich nicht draufgekommen wie man ein Wort einfügt es linkbündig macht und eine Leerzeile einfügt. Google hat mir da auch nicht weiter geholfen :frowning:

würde mich über weitere Hilfe freuen



test=*# select * from foo;
 name  | val
-------+-----
 name1 |  10
 name2 |  20
 name3 | 333
(3 rows)

Time: 0,329 ms
test=*# select name, val from foo union all select 'summe',sum(val) from foo;
 name  | val
-------+-----
 name1 |  10
 name2 |  20
 name3 | 333
 summe | 363
(4 rows)

Andreas

aber wie kriegt man eine leerzeile hin? wie im bild oben?



test=*# select name, val from foo union all select '', null union all select 'summe',sum(val) from foo;
 name  | val
-------+-----
 name1 |  10
 name2 |  20
 name3 | 333
       |
 summe | 363
(5 rows)

Das ist aber eher Aufgabe des Clients bzw. der Applikation.


Andreas

so hab jetzt folgenden code

select p.partname,s.suppname,z.quantity      
from company.supplier s,company.supp_part z,company.part p           
where s.suppno = z.suppno                                            
and z.partno = p.partno  
order by p.partname,s.suppname
union all
select ' ',' ',NULL
from dual
union all
select 'Summe:',' ',sum(quantity)
from company.supp_part;

wobei der eigentlich funktioniert sobald ich " order by " rausnehme

was ist an dem code falsch das er den den befehl " order by " nicht aktzeptiert ??

und desweiteren gibt es eine andere möglichkeit anstelle des wertes NULL das er auch nur ne leere zeile in der 3dritten spalte anzeigt?

Ist das eine Postgres Datenbank? Der Bildauschnitt erinnert an den SQL-Developer von Oracle.

Ja benutze SQL Developer von Oracle…

Habe das nächste Problem…

Sondern will ich de Firmensitzes des Lieferanten (Suppname) „Smith“ nach Berlin(City) und auch die Herstellungsorte(Part --> City) seiner Produkte nach Berlin verlagern. Diejenigen Produkte, die nicht nur von ihm geliefert werden, sollen davon nicht betroffen sein.

Tabelle:

Das heisst, ich muss in der Tabelle " Supplier die Spalte “City” ändern, und in der Tabelle (Part) die Spalte (City) ändern aber da hab ich das Problem das auch andere Firmen das selbe Produkt liefern, das heisst ich muss neue Zeilen entwerfen, aber dann ändert sich die (Partno) womit ich dann auch die Tabelle (Supp_Part) ändern muss.

Am besten wäre es beim update-statement eine Unterabfrage zu benutzen.

Dafür habe ich ein Code geschrieben der nicht elegant ist:

Code:

update supplier set city = 'Berlin' where suppname = 'Smith' and suppno = 'S1';   update supp_part set partno = 'P7' where suppno= 'S1' and partno = 'P1'; update supp_part set partno = 'P8' where suppno= 'S1' and partno = 'P2'; update supp_part set partno = 'P9' where suppno = 'S1' and partno ='P3'; update supp_part set partno = 'P10' where suppno = 'S1' and partno = 'P4'; update supp_part set partno = 'P11' where suppno= 'S1' and partno='P5'; update supp_part set partno ='P12' where suppno ='S1' and partno = 'P6';   insert into part (partno,partname,color,weight,city) values ('P7','Nut','Red','12','Berlin'); insert into part (partno,partname,color,weight,city) values ('P8','Bolt','Green','17','Berlin'); insert into part (partno,partname,color,weight,city) values ('P9','Screw','Blue','17','Berlin'); insert into part (partno,partname,color,weight,city) values ('P10','Screw','Red','14','Berlin'); insert into part (partno,partname,color,weight,city) values ('P11','Cam','Blue','12','Berlin'); insert into part (partno,partname,color,weight,city) values ('P12','Cog','Red','19','Berlin');

aber es funzt nicht ganz.

  • Firmensitz wird geändert = ok
  • aber der Rest nicht
    –> in der Tabelle Part fügt er (P7,P8,P9) ein aber wiederholt es einmal und fügt nicht (P10,P11,P12) dafür ein.
    –> in der Tabelle Supp_part ändert er alle (Partno) die zur (Suppno) der Firma gehören nur in (P8) ab

wie kann ich die beiden Fehler beheben und wie kann ich beim update statement eine Unterabfrage einbauen, was denke ich sinnvoller wäre?

mit writeable CTE, aber ich weiß nicht, ob ORA das kann. Vielleicht fragst einfach mal da beim Support oder einem hilfreichen Forum. Hier geht es um PostgreSQL.


Andreas

Es gibt unter Oracle z.B. GROUP BY CUBE, das berechnet die solche Aggregatsummen automatisch.

SELECT

Gruß Uwe

Seit wann kann SQL Developer mit PostgreSQL reden? Wie hast Du das geschafft?