Announcement

Collapse
No announcement yet.

Priorität von verschiedenen Tabellenfeldern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Priorität von verschiedenen Tabellenfeldern

    Hallo habe folgendes Problem. Möchte in meinem View ein Feld anzeigen, welches ENTWEDER den "abgerechneten" ODER den "vorbewerteten" Wert ausgibt. Aber Priorität hat der "abgerechnete" vielleicht kann man den als "default" benennen o.ä.
    Danke im Voraus. Alex
    PS: diese vorbewerteten/abgerechneten Werte sind über mehrere Datensätze aufsummiert

  • #2
    Hallo,

    wenn der MS SQL Server 2000 verwendet wird, kann diese Aufgabe über die <b>COALESCE</b>-Funktion in Verbindung mit einem <b>LEFT JOIN</b> umgesetzt werden. Das Ganze erklärt sich am Besten durch ein kleines Beispiel. Angenommen, zu einem Kunden kann die private ('H' wie Home) und die dienstliche ('B' wie Business) Telefonnummer separat gespeichert werden. Das folgende SQL-Script legt die über referenzielle Integrität verknüpften Beispieltabellen sowie einige Testdatensätze in der MS SQL Server-Datenbank <i>tempdb</i> an:
    <pre>
    <b>USE</b> tempdb
    <b>GO</b>
    <br>
    <b>CREATE</b> <b>TABLE</b> Customers (
    CustNo <b>INTEGER</b> <b>NOT</b> <b>NULL</b> <b>PRIMARY</b> <b>KEY</b>,
    LastName <b>VARCHAR</b>(10) <b>NOT</b> <b>NULL</b>,
    FirstName <b>VARCHAR</b>(10) <b>NOT</b> <b>NULL</b>)
    <b>GO</b>
    <br>
    <b>INSERT</b> <b>INTO</b> Customers <b>VALUES</b> (1,<font color="#9933CC">'Regel'</font>,<font color="#9933CC">'Wolfgang'</font>)
    <b>INSERT</b> <b>INTO</b> Customers <b>VALUES</b> (2,<font color="#9933CC">'Ritz'</font>,<font color="#9933CC">'Bernd'</font>)
    <b>INSERT</b> <b>INTO</b> Customers <b>VALUES</b> (3,<font color="#9933CC">'Lindner'</font>,<font color="#9933CC">'Andreas'</font>)
    <b>GO</b>
    <br>
    <b>CREATE</b> <b>TABLE</b> Telephones (
    TelRecNo <b>INTEGER</b> <b>NOT</b> <b>NULL</b> <b>PRIMARY</b> <b>KEY</b>,
    CustNo <b>INTEGER</b> <b>NOT</b> <b>NULL</b> <b>REFERENCES</b> Customers(CustNo),
    TelType <b>CHAR</b>(1) <b>NOT</b> <b>NULL</b> <b>CHECK</b>(TelType <b>IN</b> (<font color="#9933CC">'H'</font>,<font color="#9933CC">'B'</font>)),
    TelNo <b>INTEGER</b> <b>NOT</b> <b>NULL</b>)
    <b>GO</b>
    <br>
    <b>INSERT</b> <b>INTO</b> Telephones <b>VALUES</b>(1,1,<font color="#9933CC">'H'</font>,123)
    <b>INSERT</b> <b>INTO</b> Telephones <b>VALUES</b>(2,1,<font color="#9933CC">'B'</font>,543)
    <b>INSERT</b> <b>INTO</b> Telephones <b>VALUES</b>(3,2,<font color="#9933CC">'H'</font>,333)
    <b>INSERT</b> <b>INTO</b> Telephones <b>VALUES</b>(4,3,<font color="#9933CC">'H'</font>,666)
    <b>INSERT</b> <b>INTO</b> Telephones <b>VALUES</b>(5,3,<font color="#9933CC">'B'</font>,777)
    <b>GO</b>
    </pre>
    Eine Abfrage, bei der die Business-Telefonnummer gegenüber der Home-Telefonnummer bevorzugt wird, nutzt die <b>COALESCE</b>-Funktion. Diese Funktion gibt den ersten Ausdruck ohne NULL-Wert an die Argumente des Ausdrucks zurück, so dass ein Datensatz mit der Kennung 'B' für die dienstliche Telefonnummer bevorzugt wird. Nur dann, wenn keine dienstliche Telefonnummer vorgefunden wird, liefert die Abfrage in der gleichen Ergebnisspalte die private Telefonnummer zurück:
    <pre>
    <b>SELECT</b> c.LastName, c.FirstName,
    <b>COALESCE</b>(TB.TelNo, TH.TelNo) <b>AS</b> TelNo,
    <b>COALESCE</b>(TB.TelType, TH.TelType) <b>AS</b> TelType
    <b>FROM</b> Customers c
    <b>LEFT</b> <b>JOIN</b> Telephones TB <b>ON</b> c.CustNo = TB.CustNo <b>AND</b> TB.TelType = <font color="#9933CC">'B'</font>
    <b>LEFT</b> <b>JOIN</b> Telephones TH <b>ON</b> c.CustNo = TH.CustNo <b>AND</b> TH.TelType = <font color="#9933CC">'H'</font>
    <b>WHERE</b> <b>COALESCE</b>(TB.TelNo, TH.TelNo) <b>IS</b> <b>NOT</b> <b>NULL</b>
    </pre>
    Als Ergebnis erhält man in meinem Beispiel die folgende Auflistung:
    <pre><i><font color="#000080">LastName FirstName TelNo TelType
    -------- --------- ----- -------
    Regel Wolfgang 543 B
    Ritz Bernd 333 </font><font color="#FF0000">H</font><font color="#000080">
    Lindner Andreas 777 B
    </font></i></pre>

    Comment


    • #3
      Vielen Dank für deine Mühe, da habe ich ja jetzt was zum basteln. Viele Grüße Alex

      Comment


      • #4
        Vielen Dank für deine Mühe, ich glaub das könnte selbst mir - als völlig Ahnungslosem weiterhelfen.
        Viele Grüße Alex

        Comment

        Working...
        X