Announcement

Collapse
No announcement yet.

Probleme mit Query String

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

  • Probleme mit Query String

    Hi,

    Ich habe ein ziemliches Problem Daten aus meiner DB auszulesen und hoffe die Frage macht Sinn.

    Ich versuche Anzahl der Records fuer meine Projekte auszulesen und wenn es keinen Eintrag gibt, soll immer noch Projektname und dann halt 0 dort stehen.

    Im Prinzip habe ich das Problem das die Decode Function schon nicht geht, wenn es keinen Eintrag fuer das Projekt in der DB gibt, wie kann ich das dann uebergeben? Es ist ja klar das nichts angezeigt wird, aber es muss doch eine Moeglichkeit geben. Das Anzahl 0 ist sollte man ja mit NVL umsetzen koennen. Ich stehe hier wirklich auf dem Schlauch und hoffe jemand hat einen Tip fuer mich. Vielen Dank im Voraus.

    Code:
    SELECT
    tab1.projektTitle AS "Title",
    tab2.anzahl AS "Anzahl Records"
    
    FROM
    (SELECT
    DISTINCT project AS projectID,
    decode
      (project ,
       'proj01, 'Project 1',
       'proj02, 'Project 2',
       'proj03, 'Project 3',
      ) AS projektTitle 
    
    FROM tblProject
    GROUP BY project
    ) tab1,
    
    (SELECT COUNT (projectID) AS anzahl, project AS projectID
    FROM tblProject
    GROUP BY project
    ) tab2  
    
    
    WHERE
    tab1.projectID= tab2.projectID

  • #2
    Hallo, Luka,

    wenn ich dich richtig verstanden und deinen Code richtig gedeutet habe, müsste dir das weiterhelfen:
    Code:
    WITH projekte AS (SELECT column_value pro
                      FROM TABLE(
                        sys.odcivarchar2list('p1','p2','p3')))
       ,daten AS (SELECT 'p1' pro, 1 anz FROM dual
                  UNION ALL
                  SELECT 'p2', 2 FROM dual
                  UNION ALL
                  SELECT 'p1', 4 FROM dual)
    SELECT DECODE(p.pro,'p1','pro1'
                           ,'p2','pro2'
                           ,'p3','pro3') projekt
         ,SUM(nvl(d.anz,0)) summe
    FROM projekte p,daten d
    WHERE p.pro=d.pro(+)
    GROUP BY DECODE(p.pro,'p1','pro1'
                           ,'p2','pro2'
                           ,'p3','pro3') 
    ORDER BY 1
    ;
    PROJ      SUMME
    pro1          5
    pro2          2
    pro3          0
    Gruß

    Ralf

    Comment


    • #3
      Hi,

      vielen Dank. Das sieht jetzt um einiges komplizierter aus, koenntest Du mir sagen, was das width oben macht? Ich vermute das gehoert da nicht hin oder? Welchen Teil meines Ansatzes muss ich denn mit Deinem Teil ersetzen?

      Hoffentlich ist die Frage nicht zu unqualifiziert

      Comment


      • #4
        Eigentlich bin ich schon weg. Aber schnell noch...

        Mit den Withs werden nur temporäre Tabellen erzeugt, damit auch ein Ergebnis herauskommt.
        Du kannst das alles separat herauskopieren und dann testen, da siehst du am besten, was passiert.

        Projekte ist eine Tabelle, die nur deine möglichen Projektnamen liefern soll, die du dann mit denen, die die Daten-Tabelle liefert, über eine outer-join verknüpfst.

        Probier's aus und morgen kannst du weiter fragen.

        Ralf

        Comment


        • #5
          du kannst statt dem DECODE auch eine CASE-struktur nehmen.
          es lässt sich sehr gut lesen und kannst es schachteln.

          SELECT spalte,
          CASE spalte
          WHEN <wert> THEN <rückgabe_wert>
          WHEN <wert> THEN <rückgabe_wert>
          WHEN <wert> THEN <rückgabe_wert>
          WHEN <wert> THEN <rückgabe_wert>
          :
          ELSE <rückgabe_wert>
          END CASE
          ,<spalte>
          FROM ....

          Comment


          • #6
            Hi,

            So nach langem probieren habe ich es tatsaechlich mit der vorgeschlagenden Loesung geschafft.

            Code:
            WITH 
            
            projekte AS (SELECT column_value pro
                              FROM TABLE(
                                sys.odcivarchar2list(
                               'projekt1','projekt2','projekt3','projekt4')     
                                ))),
            Nun moechte ich aber sicher gehen, das ich das Ganze auch verstehe. Ich erzeuge also mit dem width eine temp. Tabelle. Die temp Tabelle heisst projekte oder doch TABLE?
            Doch wofuer steht column_value und TABLE genau? Nehme ich das wenn ich ansonsten keinen Spalten-, Tabellennamen habe sprich ist das immer die Bezeichnung die verwendet werden muss wenn ich eine temp. Tabelle erzeuge?

            Verstehe ich es richtig, das sys.odcivarchar2list eine System Constant ist, die varrays vom Typ VARCHAR2 speichert? "FROM TABLE(sys.odcivarchar2list(" und legt dann die Spalte mit den Elementen an?

            Ich habe also im Prinzip eine Tabelle mit dem Namen TABLE, die eine Spalte mit dem Namen column_value enthaelt und in dieser Spalte ist eine Array enthalten mit den 3 Elementen? Wie kann ich dann "WITH projekte AS" am Besten beschreiben?

            Hoffe es kann noch jemand etwas dazu sagen. Ich moechte sichergehen es auch verstanden zu haben.

            Vielen Dank im Voraus. Gruss Luka

            Comment


            • #7
              Hallo, Luka,

              odcivarchar2list ist einfach ein schon bei sys definierter public type

              TYPE SYS.ODCIVarchar2List
              AS VARRAY(32767) OF VARCHAR2(4000);


              der Zeichenketten aufnehmen kann. Dieser wird der TABLE-Funktion übergeben. Dadurch kommt dann die Pseudespalte column_value ins Spiel.

              when you use the TABLE function to refer to a scalar nested table type,
              the database returns a virtual table with a single column. This name of this
              pseudocolumn is COLUMN_ VALUE.


              Durch die With-Konstruktion wird das Ganze als Tabelle projekte übergeben.

              Ich nehme das immer mal, um eben schnell mal etwas mit Daten durchzuprobieren, wenn ich nicht extra eine Tabelle anlegen will. Für dich wäre es aber doch eigentlich sicher das Beste wenn du dir eine kleine Tabelle mit dem Kurz- und Langnamen des Projektes anlegst, denn sonst muss du bei jedem neuen Projekt ja die Abfrage anpassen.

              MfG Ralf

              Comment

              Working...
              X