PHP/SQL RP 2011 E3A Beispiele zu PHP/SQL 1. Beispiel: Programmiere dynamisch eine Tabelle mit Schachbrettmuster. Dabei gilt folgende Logik: (Sind Zeilen- UND Spaltennummer gerade), ODER (sind Zeilen- UND Spaltennummer ungerade), dann sind die Zellen schwarz gefärbt und die Schriftfarbe weiß. sonst sind die Zellen weiß und die Schrift schwarz (Sind die Zeilennummer 1 UND die Spaltennummer 1), dann soll der Inhalt aus Buchstabe und Spaltennummerierung bestehen (1A), ist aber nur die Zeilennummer 1, dann soll der Zelleninhalt aus Buchstaben bestehen, ist aber nur die Spaltennummer 1, dann soll der Zelleninhalt mit der Zeilennummer befüllt sein, sonst besteht der Inhalt aus Leerzeichen Abbildung 1: Browseransicht 2. Beispiel: Programmiere dynamisch eine Tabelle mit folgendem Aussehen, wobei folgende Logik gilt: (Ist Spaltennummer ≥ Zeilennummer UND Spalte ≤ Größe − Zeilennummer + 1) ODER (ist Spaltennummer ≤ Zeilennummer UND Spaltennummer ≥ Größe − Zeilennummer + 1), dann ist die Zelle rot gefärbt, sonst grün. Die Größe der Tabelle wird per GET übergeben und soll aus Gründen der Symmetrie eine ungerade Zahl sein. Abbildung 2: Browseransicht 1 PHP/SQL RP 2011 E3A 3. Programmiere dynamisch Tabellen mit folgendem Aussehen. Versuche dabei, den Algorithmus selbst zu entwickeln (analog zu den beiden obigen Beispielen). Dabei soll wieder die Größe per GET übergeben werden. Abbildung 3: Browseransicht Abbildung 4: Browseransicht 4. Für folgende Beispiele wird die SQL-Datei benötigt. a) Mit welchem Befehl wird der Gesamtumsatz pro Vertreter ermittelt? b) Selektiere den teuersten Artikel c) Welche Artikel liegen über dem Umsatzdurchschnitt? d) Wie viele Umsätze gibt es pro Tag? e) Gib die Werte der Tabelle artikel aus, zusätzlich aber noch den Bruttopreis bei einer Steuer von 20%. Der ursprüngliche Preis in der Tabelle artikel ist der Nettopreis. f) Die Ausgabe der Tabelle artikel soll so aussehen: liegt der Preis über 200, dann wird teuer ausgegeben, liegt er unter 100, dann billig, sonst normal. a_name | a_preis | case ----------+---------+-------Oberhemd | 39.80 | billig Mantel | 360.00 | teuer Oberhemd | 44.20 | billig Hose | 110.50 | normal 2 PHP/SQL RP 2011 E3A g) Gib den Umsatz pro Vertreter, dazu die errechnete Provision, aus. v_nr | sum | provision ------+----------+----------8413 | 9437.50 | 660.6250 5016 | 16200.00 | 810.0000 1215 | 1834.50 | 110.0700 h) Mit welchem Befehl würden alle Faulsäcke (Vertreter ohne Umsatz) ausgegeben werden? i) Mit welchem Befehl werden die Vertreter mit mehr als 2 Umsätzen ausgegeben. v_nr | anzahl umsätze ------+---------------1215 | 3 8413 | 4 j) Welche Artikel erzielen einen Umsatz über 2000? a_name | a_preis | sum ----------+---------+---------Oberhemd | 44.20 | 4862.00 Hose | 110.50 | 4420.00 Mantel | 360.00 | 16200.00 k) Gib die Artikel, ihre Preise und die Differenz zum Durchschnittspreis aus a_name | a_preis | diff ----------+---------+---------------------Oberhemd | 39.80 | -98.8250000000000000 Mantel | 360.00 | 221.3750000000000000 Oberhemd | 44.20 | -94.4250000000000000 Hose | 110.50 | -28.1250000000000000 l) Wenn Artikel teurer als der Durchschnitt sind, dann soll teurer, wenn sie billiger sind, soll billiger ausgegeben werden. ----------+---------+---------Oberhemd | 39.80 | billiger Mantel | 360.00 | teurer Oberhemd | 44.20 | billiger Hose | 110.50 | billiger m) Erkläre detailliert die notwendigen Schritte in SQL, wenn jeder Vertreter ein Geburtsdatum erhalten soll. n) Welche Beziehungen liegen zwischen den Tabellen vertreter, artikel und umsatz vor? Begründe und erläutere andere mögliche Beziehungsformen. 3 PHP/SQL RP 2011 1. Lösung Schach <table border = 1> <?PHP for ( $zeilen = 1; $zeilen <= 8; $zeilen++) { echo "<tr>"; for ($spalten = 1, $buch = "A"; $spalten <= 8; $spalten++, $buch++) { /∗ gerade ∗/ /∗ ungerade ∗/ if (( $zeilen % 2 == 0 AND $spalten % 2 == 0) OR ($zeilen % 2 == 1 AND $spalten % 2 == 1)) { $color = "#000000"; $font = "#FFFFFF"; } else { $color = "#FFFFFF"; $font = "#000000"; } /∗ wenn spalte = 1 dann inhalt = zeilennummer ∗/ if ( $zeilen == 1 AND $spalten == 1) { $inhalt = "$zeilen$buch"; } elseif ($spalten == 1) { $inhalt = $zeilen; } elseif ( $zeilen == 1) { $inhalt = $buch; } else { $inhalt = "&nbsp;"; } echo "<td bgcolor=$color><font color= $font>$inhalt</font></td>"; } echo "</tr>"; } ?> </table> 2. Lösung <table border =1> <?PHP /∗ if (! isset ($_GET["groesse"])) { echo " sie muessen z.b. tabelle1 .php?groesse=11 angeben"; exit ; }∗/ $groesse = $_GET["groesse"]; for ($x = 1; $x<=$groesse; $x++) { echo "<tr>"; for ($y = 1; $y<=$groesse; $y++) { if (($y >= $x AND $y <= ($groesse −$x + 1)) OR ($y <= $x AND $y >= $groesse − $x + 1)) { $color = "#FF0000"; } else { $color = "#00FF00"; } if ($color == "#FF0000") //kasterl rot { $font = "#00FF00"; //schrift gruen } else { $font = "#FF0000"; //schrift rot bei gruenem kastl } echo "<td bgcolor=$color><font color=$font>A</font></td>"; } echo "</tr>"; } echo $groesse ; echo "</table>"; ?> 4 E3A PHP/SQL RP 2011 3. Lösung <table border=1> <?PHP $max = 9; //$mw = ceil($max/2); for ($x=1; $x <= $max; $x++) { echo "<tr>"; for ($y=1; $y <= $max; $y++) { /∗ if ($y == $x OR ($x + $y == 2∗$mw))∗/ if ($y == $x OR ($y == $max − $x + 1)) { $color="#FF0000"; } else { $color="#FFFF00"; } echo "<td bgcolor=$color>&nbsp;</td>"; } echo "</tr>"; } ?> </table> 4. Lösung <table border=1> <?PHP $max = $_GET["size"]; $mw = ceil($max/2); for ($x=1; $x <= $max; $x++) { echo "<tr>"; for ($y=1; $y <= $max; $y++) { // if ($y == $x OR ($x + $y == 2∗$mw) OR($x == $mw) OR ($y == $mw)) if ($y == $x OR ($y == $max − $x + 1) OR($x == $mw) OR ($y == $mw)) { $color="#FF0000"; } else { $color="#FFFF00"; } echo "<td bgcolor=$color>&nbsp;</td>"; } echo "</tr>"; } ?> </table> 5. Lösung <table border=1> <?PHP $max = $_GET["size"]; //9 $mw = ceil($max/2); //5 for ($x=1; $x <= $max; $x++) { echo "<tr>"; for ($y=1; $y <= $max; $y++) { /∗ rechte obere ∗ zeile spalte ∗ 2 6 (mw + zeile − 1) ∗ 3 7 ∗ 4 8 ∗ ∗ linke untere ∗ 6 2 ( zeile − mw + 1) ∗ 7 3 ∗ 8 4 ∗ ∗ rechts unten ∗ 6 8 () ∗ 7 7 ∗ 8 6 ∗ 9 5 ∗/ // if (($x == $mw + 1 − $y) OR($x == $y − $mw +1)OR ($x == $y + $mw −1)OR($x == $mw − $y + $max )) if (($y == $mw + 1 − $x) OR($y == $x + $mw −1)OR ($y == $x − $mw +1)OR($y == $mw + $max − $x)) { $color="#FF0000"; } else { $color="#00FF00"; } echo "<td bgcolor=$color>&nbsp;</td>"; } echo "</tr>"; 5 E3A PHP/SQL RP 2011 } ?> </table> 6. Lösung <table border=1> <?PHP /∗ max = 11 ∗ zeile | spalte | spalte ∗ 3 | 3 |max − x + 1 (9) ∗ 5 | 5 |max − x + 1 (7) ∗ 7 | 7 |max − x + 1 (5) ∗ 9 | 9 |max − x + 1 (3) ∗/ $max = $_GET["size"]; //9 for ($x=1; $x <= $max; $x++) { echo "<tr>"; for ($y=1; $y <= $max; $y++) { /∗ oben: spalte 1 oder rechts unten: spalte 1 oder rechts ∗/ if ($x == 1 AND ($y == 1 OR $y == $max) OR ($x == $max AND ($y == 1 OR $y == $max))) { $color = "#000000"; } elseif (($x == $y OR $y == $max − $x + 1 ) AND $x % 2 == 1 AND $y % 2 == 1) { $color="#FF0000"; } else { $color="#00FF00"; } echo "<td bgcolor=$color>&nbsp;</td>"; } echo "</tr>"; } ?> </table> 7. Lösung <table border = 1> <?PHP $x = $_GET["size"]; //$color1 = $_GET["color1"]; //$color2 = $_GET["color2"]; //$x = 6; for ($a = 1; $a <= $x; $a++) { echo "<tr>"; for ($b = 1; $b <= $x; $b++) { /∗ zeile 1 spalte 1 zeile 1 spalte max zeile max spalte 1 zeile max ∗ spalte max ∗/ if (($a == 1 && $b == 1) ||($a == 1 && $b == $x) || ($a == $x && $b == 1) || ($a == $x && $b == $x) ) { $color = "#000000"; } elseif ($b <= $a) { $color = "#FF0000"; //$color = "$color2"; } else { $color = "#00FF00"; //$color = "$color1"; } echo "<td bgcolor=$color>&nbsp;</td>"; } echo "</tr>"; } ?> </table> 8. Lösung <table border=1> <?PHP $max = $_GET["size"]; //9 $mw = ceil($max/2); //5 for ($x=1; $x <= $max; $x++) { echo "<tr>"; for ($y=1; $y <= $max; $y++) { if ($x % 3 == 0 AND $y % 2 == 0) { $color = "#FF0000"; 6 E3A PHP/SQL RP 2011 } elseif ($x % 2 == 0 AND $y % 3 == 0) { $color="#00FF00"; } else { $color = "#FFFFFF"; } echo "<td bgcolor=$color>&nbsp;</td>"; } echo "</tr>"; } ?> </table> 9. Lösung SQL #−−−−−−−−−gesamtumsatz pro vertreter select v_name, sum(a_preis ∗ a_stueck) as "umsatz pro vertreter" from vertreter , umsatz, artikel where umsatz.v_nr = vertreter.v_nr and artikel . a_nr = umsatz.a_nr group by umsatz.v_nr, v_name; #−−−−−−−−−teuerster artikel select ∗ from artikel where a_preis = (select max(a_preis) from artikel ) #−−−−−−−−−artikel über umsatzdurchschnitt select ums.a_nr, ums.datum, ums.v_nr,art.a_preis ∗ ums.a_stueck from artikel art , umsatz ums where art.a_nr = ums.a_nr and art.a_preis ∗ ums.a_stueck > ( select avg(a.a_preis ∗ u.a_stueck) from artikel a, umsatz u where a.a_nr = u.a_nr) #−−−−−−−−−umsätze pro tag select datum,count(∗) as "umsaetze pro tag" from umsatz group by datum; #−−−−−−−−−artikel mit 20% aufschlag (brutto/netto) select a_nr, a_name, a_preis as "das ist der netto preis", a_preis ∗ 1.2 as "brutto" from artikel #−−−−−−−−−artikel billig/normal/teuer select a_name, a_preis,case when a_preis < 100 then 'billig' when a_preis > 200 then 'teuer' else 'normal' end from artikel ; #−−−−−−−−−umsatz pro vertreter incl. provision select vertreter .v_nr,sum(a_stueck ∗ a_preis), sum(a_stueck∗a_preis)∗vertreter.v_prov as "provision" from umsatz, artikel , vertreter where artikel .a_nr = umsatz.a_nr and umsatz.v_nr = vertreter.v_nr group by vertreter.v_nr, vertreter.v_prov; #−−−−−−−−−vertreter ohne umsatz select v_name from vertreter v left join umsatz u on u.v_nr = v.v_nr where u.v_nr is null #−−−−−−−−−vertreter mit mehr als 2 umsätzen select v_nr, count(∗) as "anzahl umsätze" from umsatz group by v_nr having count(∗) > 2 #−−−−−−−−−umsatz von artikeln über 2000 select artikel . a_name, artikel.a_preis,sum(a_stueck ∗ a_preis) from artikel , umsatz where artikel.a_nr = umsatz.a_nr and artikel.a_nr in ( select a.a_nr from umsatz u, artikel a where a.a_nr = u.a_nr group by a.a_nr having sum(u.a_stueck ∗ a.a_preis) > 2000)group by artikel . a_name,a_preis; #−−−−−−−−−artikelpreise und differenz zum durchschnitt select a_name, a_preis, a_preis − (select avg(a_preis) from artikel) as diff from artikel ; #−−−−−−−−−wenn preis über durchschnitt dann teurer, wenn unter dann #billig , sonst durchschnitt select a_name, a_preis, case when a_preis − "mittel" > 0 then 'teurer' when a_preis − "mittel" < 0 then 'billiger' else 'durchschnitt' end from ( select ∗,( select avg(a_preis) from artikel ) as mittel from artikel ) as x; #−− oder so −−# select a_name, a_preis, case when a_preis −(select avg(a_preis) from artikel) > 0 then 'teurer' when a_preis −(select avg(a_preis) from artikel) < 0 then ' billiger ' else 'durchschnitt' end from artikel 7 E3A