Anzeigen bestimmter Spalten nach bestimmten Bedingungen

Hier kommen Posts zu anderen Datenbanken als PostgreSQL rein.
pixal
Neuer Benutzer
Beiträge: 5
Registriert: Sa 21. Apr 2012, 00:46

Anzeigen bestimmter Spalten nach bestimmten Bedingungen

Beitrag von pixal » Sa 21. Apr 2012, 00:54

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:

Code: Alles auswählen

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 Bild und bin verzweifelt

akretschmer
Erfahrener Benutzer
Beiträge: 7511
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitrag von akretschmer » Sa 21. Apr 2012, 09:47

pixal hat geschrieben: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:

Code: Alles auswählen

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 Bild 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.

Code: Alles auswählen

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?
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

pixal
Neuer Benutzer
Beiträge: 5
Registriert: Sa 21. Apr 2012, 00:46

Beitrag von pixal » So 22. Apr 2012, 04:27

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

Code: Alles auswählen

and e.stat_txt  !='geliefert';


Jetzt hänge ich an einer weiteren Stelle fest.

Sondern hab ich diesen Code schon mal geschrieben:

Code: Alles auswählen

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 ^^
Bild

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 :-(

würde mich über weitere Hilfe freuen

akretschmer
Erfahrener Benutzer
Beiträge: 7511
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitrag von akretschmer » So 22. Apr 2012, 09:04

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

Code: Alles auswählen

and e.stat_txt  !='geliefert';


Jetzt hänge ich an einer weiteren Stelle fest.

Sondern hab ich diesen Code schon mal geschrieben:

Code: Alles auswählen

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 ^^
Bild

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 :-(

würde mich über weitere Hilfe freuen


Code: Alles auswählen

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
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

pixal
Neuer Benutzer
Beiträge: 5
Registriert: Sa 21. Apr 2012, 00:46

Beitrag von pixal » So 22. Apr 2012, 16:49

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

akretschmer
Erfahrener Benutzer
Beiträge: 7511
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitrag von akretschmer » So 22. Apr 2012, 16:53

pixal hat geschrieben:aber wie kriegt man eine leerzeile hin? wie im bild oben?


Code: Alles auswählen

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
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

pixal
Neuer Benutzer
Beiträge: 5
Registriert: Sa 21. Apr 2012, 00:46

Beitrag von pixal » So 22. Apr 2012, 17:08

so hab jetzt folgenden code

Code: Alles auswählen

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?

Gisman
Erfahrener Benutzer
Beiträge: 1105
Registriert: Fr 20. Jan 2006, 15:30
Wohnort: Pfalz
Kontaktdaten:

Beitrag von Gisman » Mo 23. Apr 2012, 08:11

Ist das eine Postgres Datenbank? Der Bildauschnitt erinnert an den SQL-Developer von Oracle.
Have a lot of fun!

pixal
Neuer Benutzer
Beiträge: 5
Registriert: Sa 21. Apr 2012, 00:46

Beitrag von pixal » Di 24. Apr 2012, 12:28

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:

Bild

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:

Code: Alles auswählen


    
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?

akretschmer
Erfahrener Benutzer
Beiträge: 7511
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitrag von akretschmer » Di 24. Apr 2012, 12:34

pixal hat geschrieben:[font=arial]Ja benutze SQL Developer von Oracle...

Habe das nächste Problem...

... 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
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Antworten