2016-05-18 5 views
0

Ich verwende Oracle in Hyperion Studio. Ich glaube, es ist Oracle 11, aber ich bin mir nicht sicher, wie ich das überprüfen soll ... das ist alles ziemlich neu für mich, und ich bin sehr, sehr viel Neuling, ich entschuldige mich.Verketten Sie zwei Zeilen in derselben Spalte zu einer Zeile (Oracle); benutze LISTAGG?

In jedem Fall verwende ich eine Abfrage, um eine Liste der Klassen zusammen mit den Namen der Dozenten zurückzugeben.

Es gibt zwei Probleme, die entstehen:

  1. Instructor Name in mehrere Spalten aufgeteilt wird. Ich löste dies einfach mit rekursiven CONCAT in einem Computed Item:

    CONCAT (Request.Instructor_Last_Name,CONCAT(', ',Request.Instructor_First_Name)) 
    
  2. Ein Kurs kann mehr als einen Lehrer hat. Ich möchte, dass jeder Kurs nur eine Zeile in den Ergebnissen hat, also dachte ich, ich würde versuchen, alle Instruktoren in einem einzigen verketteten Feld zu zeigen.

Um zu versuchen, das zweite Problem zu lösen, habe ich versucht LISTAGG und CONCAT zusammen in einem Computed Artikel mit:

LISTAGG(CONCAT (Request.Instructor_Last_Name,CONCAT(', ',Request.Instructor_First_Name)), 'and ') 
WITHIN GROUP (ORDER BY Request.Instructor_Last_Name DESC) "All Instructors" 

Dies gibt den Fehler ORA-00937: not a single-group group function.

Das brachte mich auf diese Frage: LISTAGG Query "ORA-00937: not a single-group group function" Ich versuchte Variationen der Lösung dort, ohne Erfolg. Hier ist ein Beispiel, das ich versucht:

LISTAGG(CONCAT (Request.Instructor_Last_Name,CONCAT(', ',Request.Instructor_First_Name)), 'and ') 
WITHIN GROUP (ORDER BY Request.Instructor_Last_Name DESC) "All Instructors" 
FROM Request 
GROUP BY * 

Dieser den Fehler zurückgibt:

ORA-00936: missing expression

Ich habe auch versucht

ersetzen
LISTAGG(CONCAT (Request.Instructor_Last_Name,CONCAT(', ',Request.Instructor_First_Name)), 'and ') 

mit

LISTAGG(Request.Instructor_Last_Name || ', ' || Request.Instructor_First_Name,'and ') 

basiert auf etwas, das ich gelesen, aber das war nicht Es macht einen Unterschied (ich bin mir nicht einmal sicher, ob das überhaupt funktioniert).

Das hat mich erschöpft. Ich bin an dieser Stelle sicher, dass die Antwort muss mich nur wegen meiner Unerfahrenheit wird eluding, so wird jede Hilfe enorm geschätzt ...


Hier ist eine sehr abgespeckte Version der Abfrage, mit dem Code vkp vorgeschlagen (diese sind Banner-Tabellen, wie manche erkennen kann):

SELECT DISTINCT 
AL1.SFRSTCR_TERM_CODE, AL1.SFRSTCR_CRN, 
AL3.SPRIDEN_FIRST_NAME, AL3.SPRIDEN_LAST_NAME, 
CONCAT ((AL3.SPRIDEN_LAST_NAME),CONCAT(', ',(AL3.SPRIDEN_FIRST_NAME))), 
select Student_Registration_CRN, 
LISTAGG((Instructor_Last_Name||', '||Instructor_First_Name), 'and ')) 
WITHIN GROUP (ORDER BY Instructor_Last_Name DESC) "All Instructors" 
FROM Request 
group by Student_Registration_CRN 
FROM SATURN.SFRSTCR AL1, SATURN.SIRASGN AL2, SATURN.SPRIDEN AL3 
WHERE (AL1.SFRSTCR_TERM_CODE = AL2.SIRASGN_TERM_CODE (+) 
AND AL1.SFRSTCR_CRN = AL2.SIRASGN_CRN (+) 
AND AL2.SIRASGN_PIDM = AL3.SPRIDEN_PIDM (+)) 
AND ((AL3.SPRIDEN_CHANGE_IND IS NULL AND AL1.SFRSTCR_TERM_CODE='201660')) 

Dies erzeugt den Fehler:

ORA-00936: missing expression

ich Aliase für einige der Spaltennamen verwendet haben, so habe ich versucht, die vorgeschlagene c Ode ohne Aliase, aber das schien keinen Unterschied zu machen.


Ich habe versucht, Boneist empfohlenen SQL verwenden, um die SQL-Datei direkt importieren, anstatt mit den visuellen Builder und Computed Artikel.Hier ist, was ich zu laufen versucht:

select distinct 
    al1.sfrstcr_term_code, 
    al1.sfrstcr_crn, 
    al3.spriden_first_name, 
    al3.spriden_last_name, 
    al3.spriden_last_name||', '||al3.spriden_first_name, 
    (select sfrstcr_crn, 
      listagg(spriden_last_name || ', ' || spriden_first_name, 'and ') 
       within group (order by spriden_last_name desc) 
    from  request req 
    where sfrstcr_crn = al1.sfrstcr_crn 
    group by sfrstcr_crn) "All Instructors" 
from saturn.sfrstcr al1 
    left outer join saturn.sirasgn al2 on (al1.sfrstcr_term_code = al2.sirasgn_term_code 
              and al1.sfrstcr_crn = al2.sirasgn_crn) 
    left outer join saturn.spriden al3 on (al2.sirasgn_pidm = al3.spriden_pidm(+)) 
where al3.spriden_change_ind is null 
and al1.sfrstcr_term_code = '201660'; 

Leider ist dies den Fehler zurückgibt:

ORA-00933: SQL command not properly ended

dachte ich, basierend auf einigem Suchen, dass es irgendwie sein könnte, dass die Zitate nicht korrekt waren importieren, so habe ich versucht, etwas noch Grund:

select distinct 
    al1.sfrstcr_term_code, 
    al1.sfrstcr_crn, 
    al3.spriden_first_name, 
    al3.spriden_last_name 
from saturn.sfrstcr al1 
    left outer join saturn.sirasgn al2 on (al1.sfrstcr_term_code = al2.sirasgn_term_code 
              and al1.sfrstcr_crn = al2.sirasgn_crn) 
    left outer join saturn.spriden al3 on (al2.sirasgn_pidm = al3.spriden_pidm(+)) 
where al3.spriden_change_ind is null; 

aber ich immer noch die gleichen Fehler ... ich habe versucht, für die Suche, was es sonst dazu führen könnten, aber nichts hilfreich ... ich bin nicht sicher, was sonst zu t ry an diesem Punkt.

+0

'Gruppe von *'? Was soll das tun? –

+0

Ich habe irgendwo in meiner Suche gelesen, dass Sie nach der ausgewählten Gruppe gruppieren müssen, und ich war mir nicht sicher, was genau ein Computed Item auswählt, also dachte ich, ich würde versuchen, nur nach etwas zu gruppieren ... was nicht schien Arbeit, oops ... –

Antwort

1

bereits.

select class_id, 
LISTAGG((Instructor_Last_Name||', '||Instructor_First_Name), 'and ')) 
WITHIN GROUP (ORDER BY Instructor_Last_Name DESC) "All Instructors" 
FROM Request 
group by class_id 
+0

Ersetze class_id mit dem passenden Spaltennamen (es ist Student_Registration_CRN, sorry, es weggelassen zu haben!), versuchte ich dieses aber leider erhielt den Fehler 'ORA-00936: fehlender Ausdruck' ... –

+0

können Sie den Pfosten Vollständige Abfrage wird verwendet? –

+0

Sicher ... es ist ein bisschen kompliziert, da es mehrere Tabellen referenziert, aber ich werde es oben hinzufügen ... –

0

Ich glaube, du bist nach etwas entlang der Linien von:

with sample_data as (select 'Bob' first_name, 'Jones' last_name, 1 course_id from dual union all 
        select 'John' first_name, 'Bloggs' last_name, 1 course_id from dual union all 
        select 'Fred' first_name, 'Hoskins' last_name, 1 course_id from dual union all 
        select 'Bob' first_name, 'Jones' last_name, 2 course_id from dual union all 
        select 'John' first_name, 'Bloggs' last_name, 2 course_id from dual union all 
        select 'Fred' first_name, 'Hoskins' last_name, 3 course_id from dual) 
-- end of setting up a subquery to mimic a table called sample_data for use in the SQL below: 
select course_id, 
     listagg(first_name||' '||last_name, ', ') within group (order by last_name) instructors 
from sample_data 
group by course_id; 


COURSE_ID INSTRUCTORS        
---------- ---------------------------------------- 
     1 John Bloggs, Fred Hoskins, Bob Jones  
     2 John Bloggs, Bob Jones     
     3 Fred Hoskins   

Beachten Sie, wie ich Ihre CONCAT s mit || ersetzt haben, so dass viel flexibler ist und erfordert keine Verschachtelung von CONCAT s, wenn Sie mehr als zwei Saiten zusammenfügen! Es ist auch viel einfacher zu lesen.


Ich vermute, dass die Abfrage Sie suchen etwas entlang der Linien von ist:

select distinct 
     al1.sfrstcr_term_code, 
     al1.sfrstcr_crn, 
     al3.spriden_first_name, 
     al3.spriden_last_name, 
     al3.spriden_last_name||', '||al3.spriden_first_name, 
     (select student_registration_crn, 
       listagg(instructor_last_name || ', ' || instructor_first_name, 'and ') 
        within group (order by instructor_last_name desc) 
     from  request req 
     where <join condition(s) between this query and the main query> 
     group by student_registration_crn) "All Instructors" 
from saturn.sfrstcr al1 
     left outer join saturn.sirasgn al2 on (al1.sfrstcr_term_code = al2.sirasgn_term_code 
               and al1.sfrstcr_crn = al2.sirasgn_crn) 
     left outer join saturn.spriden al3 on (al2.sirasgn_pidm = al3.spriden_pidm(+)) 
where al3.spriden_change_ind is null 
and al1.sfrstcr_term_code = '201660'; 

Es gab einige Probleme mit der Abfrage, die ich korrigiert haben:

  1. Die Skalare Unterabfrage (das heißt, wenn Sie eine Spalte mit einer SELECT-Anweisung ausfüllen) muss in Klammern stehen.
  2. Verwenden Sie nach Möglichkeit die neueren ANSI-Joins anstelle der alten Joins.
  3. Sie vermissen eine Join-Bedingung aus Ihrer skalaren Unterabfrage zu Ihrer äußeren Abfrage - Sie müssen diese einschließen. Außerdem muss eine skalare Unterabfrage höchstens eine Zeile zurückgeben, andernfalls wird ein Fehler angezeigt.
+0

Wie bei der Antwort von vkp habe ich das versucht und die entsprechenden Feldnamen ersetzt, aber den Fehler 'ORA-00936: fehlender Ausdruck' erhalten. Ich setze diesen Code als einen berechneten Artikel ein. Könnte das etwas damit zu tun haben? –

+1

@Violet Ich habe meine Antwort mit einigen Hinweisen zu Ihrer abgespeckten Abfrage aktualisiert. Ich hoffe, das hilft! – Boneist

+0

Vielen Dank!Das SQL (abgesehen von der Unterabfrage) wurde von Hyperion Studio automatisch erstellt, aber ich habe gerade entdeckt, dass es möglich ist, benutzerdefiniertes SQL zu importieren, also habe ich es versucht. Ich habe meine Ergebnisse zu meiner ursprünglichen Frage hinzugefügt. –

Verwandte Themen