2016-12-23 14 views
0

Ich arbeite an Oracle 11g und ich versuche, eine Abfrage zu schreiben, fügt ‚?‘ für alle fehlenden Monate zwischen 2 Daten. Das kann ich erreichen. aber jetzt möchte ich alle Datensätze einer bestimmten Spalte in einem einzigen Datensatz zusammenzustellen. Ich habe LISTAGG Funktion verwendet, um dies zu erreichen, aber ich bin eine Fehlermeldung „ungültige Kennung“ für die Spalte innerhalb LISTAGG Funktion bekommen. Hier ist mein Code: -Oracle 11g LISTAGG Funktion mit mehrere Unterabfrage

Select facilitynumber, LISTAGG(facilitystatus, '') WITHIN GROUP (ORDER BY null) "Profile" FROM ( WITH allmonths AS ( SELECT to_date(level, 'MM') AS allmnths FROM dual CONNECT BY LEVEL BETWEEN '01' AND '05' ), months AS ( SELECT * FROM ( SELECT ccds.facilitynumber,ccds.facilitystatus, dsub.filecreationdate as FacilityStatusDate, dsub.submissiondate, ROW_NUMBER() OVER (partition by ccds.facilitynumber,extract(month from dsub.submissiondate) order by dsub.submissiondate DESC) r FROM ccdssubmissions ccds INNER JOIN datasubmission dsub ON ccds.datasubmissionid = dsub.datasubmissionid INNER JOIN datasupplier dsup ON dsub.datasupplierid = dsup.datasupplierid WHERE ccds.matchedcompanynumber = 'TEST9239' ORDER BY dsub.submissiondate DESC ) where r = 1) SELECT allmnths, CASE WHEN facilitystatus IS NULL THEN '?' ELSE facilitystatus END AS "facilitystatus", submissiondate, facilitynumber FROM allmonths LEFT OUTER JOIN months ON extract(month from allmonths.allmnths) = extract(month from months.submissiondate) order by allmnths ) GROUP BY facilitynumber;

ich Fehler konfrontiert bin in der 2. Zeile selbst. Meine Unterabfrage dh Abfrage von "MIT" Starten welche Ergebnisse wie folgt: -

ALLMNTHS| facilitystatus | submissiondate | facilitynumber 

--------- | --------------- | --------------- | ---------------  
01-JAN-16 | U     | 23-JAN-16   | FAC01    
01-FEB-16 | ?     | null    | null    
01-MAR-16 | 1     |05-MAR-16   | FAC01    

nun die LISTAGG mit (facilitystatus, ''), möchte ich mein Ergebnis sein ->

Profile| facilitynumber 
    U?1   | FAC01 

Aber , Oracle kann die Spalte "facilitystatus" nicht erkennen und kann daher nicht das gewünschte Ergebnis erzielen.

Jede Hilfe würde sehr geschätzt werden.

Dank

+0

bei äußeren Abfrage Sie haben 'GROUP BY Einrichtungsnummer', das ist t er Grund, dass Sie diesen Fehler bekommen. Gruppe entfernen nach und Zeilen für letzten Monat erhalten, es könnte funktionieren. –

+0

Nein. Gleicher Fehler. – Anuja

Antwort

2

Sie den Preis für die Zahlung, was eine sehr schlechte Praxis ist, zumindest in Oracle.

Wenn Sie einen Spaltennamen in Anführungszeichen setzen, wie z. B. "facilitystatus", wird er im Katalog genauso wie in Kleinbuchstaben geschrieben. Wenn Sie es in der äußeren Abfrage ohne die Anführungszeichen verweisen, wird der Name in Großbuchstaben automatisch konvertiert (das ist, was Oracle der Fall ist, ich weiß nicht, über andere DB-Produkte). Es gibt also natürlich eine Diskrepanz.

Es gibt absolut keine Notwendigkeit für die doppelten Anführungszeichen in der Unterabfrage. Entferne sie und schau was passiert. (Entweder funktioniert die Abfrage, oder Sie erhalten einen anderen, nicht zusammenhängenden Fehler.) Viel Glück!

Nicht immer in doppelten Anführungszeichen Namen verwenden. Sie werden aus den folgenden Gründen verwendet, von denen kein Sinn machen (besser, um die Situation in erster Linie zu vermeiden):

  • Verwenden spezifische Aktivierung (statt Groß- und Kleinschreibung - standardmäßig die Namen im Katalog eingetragen werden in allen Kappen und in Ihrem Code können Sie jede Kapitalisierung)
  • einbetten Leerzeichen in Namen
  • Nutzung reservierten Wörter und Schlüsselwörter verwenden (wie DATE und COLUMN) als Spalte oder Tabellennamen
+0

Hervorragend! Ich wusste nichts über das Anführungszeichen. Das Entfernen dieser Zitate funktionierte für mich :) – Anuja