Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 15 von 15

Thema: Kein Ergebnis bei Abfrage mit Unterabfragen

  1. #11
    elephant ist offline Neuer Benutzer
    Registriert seit
    17.09.2009
    Beiträge
    9

    Standard

    Hallo nochmals,

    ich hab das Beispiel gestern zig mal versucht umzusetzen, bin aber leider gescheitert. Hab allerdings die Funktion crosstab für mein Problemchen entdeckt. Allerdings hakt die ganze Sache noch an den Anzahl Spalten. Meine Query:

    Code:
    SELECT * FROM crosstab('SELECT sopinstanceuid,  tag, value from dcmtag WHERE 
    tag = ''0000,0903''  AND sopinstanceuid IN (''1.3.51.0.7.2545223877.51878.5447.48939.44644.10011.28045'')  
    OR tag = ''0008,0032''  AND sopinstanceuid IN (''1.3.51.0.7.2545223877.51878.5447.48939.44644.10011.28045'')   
    OR tag = ''0008,0068''  AND sopinstanceuid IN (''1.3.51.0.7.2545223877.51878.5447.48939.44644.10011.28045'')  
    OR tag = ''0008,1030''  AND sopinstanceuid IN (''1.3.51.0.7.2545223877.51878.5447.48939.44644.10011.28045'') ',
    'SELECT DISTINCT tag from dcmtag 
        WHERE tag = ''0000,0903'' 
           OR tag = ''0008,0032'' 
           OR tag = ''0008,0068'' 
           OR tag = ''0008,1030'' 
        ORDER BY tag')
    AS ct(   "Error ID" text, "Acquisition Time" text, "Presentation Intent Type" text, "Study Description" text)
    Ergebnis ist in diesem Beispiel eine vierspaltige Tabelle mit den Spaltennamen "Error ID", "Acquisition Time", "Presentation Intent Type", "Study Description".
    Beim crosstab enthält doch die erste Spalte die sog. row_id (bei mir die sog. sopinstanceuid), die er mir in die Spalte "Error ID" schreibt und falsch ist. Füge ich der AS-Clause noch einen Parameter row_id hinzu sagt er mir:
    Query-specified return tuple has 5 columns but crosstab returns 4

    Ich starre schon stundenlang auf das Beispiel in der Doku und versuch den Fehler zu finden. Darin entspricht die "Kategorie-Abfrage", also die zweite SELECT DISTINCT auch nicht der Anzahl der Parameter in der AS-Clause...

    Aus der Doku:
    Code:
    SELECT * FROM crosstab
    (
      'SELECT rowid, rowdt, attribute, val FROM cth ORDER BY 1',
      'SELECT DISTINCT attribute FROM cth ORDER BY 1'
    )
    AS
    (
           rowid text,
           rowdt timestamp,
           temperature int4,
           test_result text,
           test_startdate timestamp,
           volts float8
    );
    Bin ja schon kurz vor dem verzweifeln und weiß nicht mehr weiter!

    Schon mal DANKE für jede Hilfe!



  2. #12
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von elephant Beitrag anzeigen
    Hallo,

    das hab ich verstanden! Aber ich kann die Lösung nicht auf mein Problem anwenden. Die Tabellenstruktur sieht stark vereinfacht wie folgt aus:
    Code:
     sopinstanceuid |      tag     | value
    ----------------+-------------+------
       123          |  0008,0008   | test1
       123          |  0008,0021   | test2
       123          |  0010,0010   | test3
       123          |  0018,0090   | test4
    
       456          |  0008,0008   | test11
       456          |  0008,0021   | test22
       456          |  0010,0010   | test33
    
       789          |  0008,0008   | test111
       789          |  0008,0021   | test222
       789          |  0010,0010   | test333
       789          |  0018,0090   | test444
    Die sopinstanceuid fasst sozusagen die tags mit value zu einer logischen Einheit zusammen. Man könnte zwar bei diesem einfachen Beispiel auf die Idee kommen, daraus zwei Tabellen zu machen, praktisch ist aber das unmöglich ...
    Man beachte, dass bei sopinstanceuid 456 der tag 0018,0090 fehlt!

    Das erwartete Ergbnis sieht dann folgendermaßen aus:

    Code:
    0008,0008  |  0008,0021  | 0010,0010  | 0018,0090
     ----------+-------------+------------+----------+
       test1    |    test2   |    test3   |   test4
       test11   |    test22  |    test33  |    
       test111  |    test222 |    test333 |   test444
    Die WHERE-CLAUSE sorgt dafür, dass die values in einer Zeile stehen. Ansonsten würde das ein cross-Join werden ...

    Die Abfrage von oben erspar ich mir an dieser Stelle! Wie gesagt funktioniert das einwandfrei, wenn alle Unterabfragen Ergebnisse zurückliefern. Es muss doch eine Möglichkeit geben, trotzdem immer alle Ergebnisse auszugeben, auch wenn eine Unterabfrage nichts zurückgibt!

    Schon mal Danke für deine/eure Hilfe!
    Code:
    test=*# select * from elephant ;
     sopinstanceuid |    tag    |  value
    ----------------+-----------+---------
     123            | 0008,0008 | test1
     123            | 0008,0021 | test2
     123            | 0010,0010 | test3
     123            | 0018,0090 | test4
     456            | 0008,0008 | test11
     456            | 0008,0021 | test22
     456            | 0010,0010 | test33
     789            | 0008,0008 | test111
     789            | 0008,0021 | test222
     789            | 0010,0010 | test333
     789            | 0018,0090 | test444
    (11 rows)
    
    test=*# select sopinstanceuid, array_to_string(array_agg(case when tag='0008,0008' then value else null end),',') as "0008,0008", array_to_string(array_agg(case when tag='0008,0021' then value else null end),',') as "0008,0021", array_to_string(array_agg(case when tag='0010,0010' then value else null end),',') as "0010,0010", array_to_string(array_agg(case when tag='0018,0090' then value else null end),',') as "0018,0090" from elephant group by 1 order by 1;
     sopinstanceuid | 0008,0008 | 0008,0021 | 0010,0010 | 0018,0090
    ----------------+-----------+-----------+-----------+-----------
     123            | test1     | test2     | test3     | test4
     456            | test11    | test22    | test33    |
     789            | test111   | test222   | test333   | test444
    (3 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

  3. #13
    elephant ist offline Neuer Benutzer
    Registriert seit
    17.09.2009
    Beiträge
    9

    Standard

    ... endlich funktioniert es! Vielen DANK!!!

    Jetzt möcht ich das auch verstehen ... hast du noch kurz Zeit

    Ich nehm mir mal die Zeile:
    Code:
    array_to_string(array_agg(case when tag='0008,0008' then value else null end),',') as "0008,0008",
    Die Funktion array_agg macht doch aus der Ergebnismenge ein Array. array_to_string macht aus dem Array einen String mit Komma als Delimiter. Wie kommt es, dass der Inhalt des Strings mit Komma untereinander in der Tabelle steht?

    Ich hab ja in meine erste Abfrage mit den SELECT ... AS und in der mit crosstab viel Zeit investiert und dennoch hat es nicht funktioniert. Kannst du mir auch sagen wieso?

    Bin auch dafür sehr dankbar

  4. #14
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von elephant Beitrag anzeigen
    ... endlich funktioniert es! Vielen DANK!!!

    Jetzt möcht ich das auch verstehen ... hast du noch kurz Zeit

    Ich nehm mir mal die Zeile:
    Code:
    array_to_string(array_agg(case when tag='0008,0008' then value else null end),',') as "0008,0008",
    Die Funktion array_agg macht doch aus der Ergebnismenge ein Array. array_to_string macht aus dem Array einen String mit Komma als Delimiter. Wie kommt es, dass der Inhalt des Strings mit Komma untereinander in der Tabelle steht?

    Ich hab ja in meine erste Abfrage mit den SELECT ... AS und in der mit crosstab viel Zeit investiert und dennoch hat es nicht funktioniert. Kannst du mir auch sagen wieso?

    Bin auch dafür sehr dankbar

    Ich hatte erst:

    Code:
    test=*# select array_to_string(array_agg(case when tag='0008,0008' then value else null end),',') as "0008,0008", array_to_string(array_agg(case when tag='0008,0021' then value else null end),',') as "0008,0021", array_to_string(array_agg(case when tag='0010,0010' then value else null end),',') as "0010,0010", array_to_string(array_agg(case when tag='0018,0090' then value else null end),',') as "0018,0090" from elephant;
          0008,0008       |      0008,0021       |      0010,0010       |   0018,0090
    ----------------------+----------------------+----------------------+---------------
     test1,test11,test111 | test2,test22,test222 | test3,test33,test333 | test4,test444
    (1 row)
    Was aber nicht das ist, was Du wolltest. Also habe ich noch die Dingens-Id-Spalte dazugenommen und nach dieser gruppiert.

    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

  5. #15
    elephant ist offline Neuer Benutzer
    Registriert seit
    17.09.2009
    Beiträge
    9

    Standard

    Nochmals vielen Dank!!!

    Zitat Zitat von akretschmer Beitrag anzeigen
    Ich hatte erst:

    Code:
    test=*# select array_to_string(array_agg(case when tag='0008,0008' then value else null end),',') as "0008,0008", array_to_string(array_agg(case when tag='0008,0021' then value else null end),',') as "0008,0021", array_to_string(array_agg(case when tag='0010,0010' then value else null end),',') as "0010,0010", array_to_string(array_agg(case when tag='0018,0090' then value else null end),',') as "0018,0090" from elephant;
          0008,0008       |      0008,0021       |      0010,0010       |   0018,0090
    ----------------------+----------------------+----------------------+---------------
     test1,test11,test111 | test2,test22,test222 | test3,test33,test333 | test4,test444
    (1 row)
    Was aber nicht das ist, was Du wolltest. Also habe ich noch die Dingens-Id-Spalte dazugenommen und nach dieser gruppiert.

    Andreas

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Problem Perl execute liefert kein Ergebnis bei raise notice
    Von mkuis im Forum Programmierung
    Antworten: 2
    Letzter Beitrag: 10.09.2010, 10:38
  2. Unterabfragen zusammenlegbar?
    Von mikser im Forum SQL
    Antworten: 5
    Letzter Beitrag: 30.04.2008, 10:25
  3. Select abfrage mit bestem ergebnis??
    Von Henning im Forum SQL
    Antworten: 3
    Letzter Beitrag: 05.03.2008, 11:20
  4. Antworten: 10
    Letzter Beitrag: 11.09.2007, 14:54
  5. Die Abfrage lieferte kein Ergebnis
    Von sladda im Forum Allgemeines
    Antworten: 1
    Letzter Beitrag: 18.06.2007, 14:23

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum