Anzeigen bestimmter Spalten nach bestimmten Bedingungen

Hier kommen Posts zu anderen Datenbanken als PostgreSQL rein.

Anzeigen bestimmter Spalten nach bestimmten Bedingungen

Beitragvon 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
pixal
Neuer Benutzer
 
Beiträge: 5
Registriert: Sa 21. Apr 2012, 00:46

Beitragvon 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?
--
ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)

https://www.xing.com/profile/Andreas_Kretschmer7
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5936
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

Beitragvon 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
pixal
Neuer Benutzer
 
Beiträge: 5
Registriert: Sa 21. Apr 2012, 00:46

Beitragvon 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
--
ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)

https://www.xing.com/profile/Andreas_Kretschmer7
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5936
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

Beitragvon pixal » So 22. Apr 2012, 16:49

aber wie kriegt man eine leerzeile hin? wie im bild oben?
pixal
Neuer Benutzer
 
Beiträge: 5
Registriert: Sa 21. Apr 2012, 00:46

Beitragvon 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
--
ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)

https://www.xing.com/profile/Andreas_Kretschmer7
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5936
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

Beitragvon 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?
pixal
Neuer Benutzer
 
Beiträge: 5
Registriert: Sa 21. Apr 2012, 00:46

Beitragvon 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!
Gisman
Erfahrener Benutzer
 
Beiträge: 863
Registriert: Fr 20. Jan 2006, 16:30
Wohnort: Pfalz

Beitragvon 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?
pixal
Neuer Benutzer
 
Beiträge: 5
Registriert: Sa 21. Apr 2012, 00:46

Beitragvon 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
--
ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)

https://www.xing.com/profile/Andreas_Kretschmer7
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5936
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

Nächste

Zurück zu Andere Datenbanken

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste