2017-08-30 4 views
0

Vorher hatte ich diese Abfrage -SQL GROUP BY für verschachtelte SELECT-Anweisungen

SELECT 
    COUNT(DISTINCT ds.CLIENTID), 
    COUNT(ds.FACID), 
    (SUM(ds.NETARREARS) + SUM(ds.TAXARREARS)), 
    SUM(ds.UNEARNEDINCOME), 
    SUM(ds.INCOMESUSPENSE) , 
    SUM(ds.VATSUSPENSE) , 
    SUM(ds.PREPAIDDEPOSIT), 
    SUM(ds.NETFUTURE) , 
    SUM(ds.NETEXPOSURE), 
    SUM(ds.PROVISION), 
    SUM(ds.FACILITYSECURITYAMOUNT), 
    SUM(ds.PROVISIONAMOUNTCFWD) 

FROM 
    DAILY_SUMMARY ds 

WHERE 
    ds.SUMMARY_DATE = :reportDate AND 
    ds.FACSTS IN('F','L','A') AND 
    ds.PERSTS = 'N'; 

Aber später haben wir beschlossen, die Spalten

  1. ds.UNEARNEDINCOME (4. wählen Sie den Punkt von oben)
  2. ds.PROVISION (fallen 10. Artikel von oben wählen)

Weil wir alternative quer haben

  1. SELECT SUM(tcs.DUEAMT) FROM TCRENT tcs WHERE tcs.FACID = ds.FACID AND tcs.DUETYPE = 'INT' AND tcs.DUEDATE > :reportDate
  2. SELECT sum(pup.PROVISIONAMT) FROM PROVISION_UPLOAD pup WHERE pup.PROVISIONDATE < :reportDate AND pup.FACID = ds.FACID

So ist die letzte Abfrage ist - -

SELECT 
    COUNT(DISTINCT ds.CLIENTID), 
    COUNT(ds.FACID), 
    (SUM(ds.NETARREARS) + SUM(ds.TAXARREARS)), 
    (SELECT SUM(tcs.DUEAMT) FROM TCRENT tcs WHERE tcs.FACID = ds.FACID AND tcs.DUETYPE = 'INT' AND tcs.DUEDATE > :reportDate) AS income, 
    SUM(ds.INCOMESUSPENSE) , 
    SUM(ds.VATSUSPENSE) , 
    SUM(ds.PREPAIDDEPOSIT), 
    SUM(ds.NETFUTURE) , 
    SUM(ds.NETEXPOSURE), 
    (SELECT sum(pup.PROVISIONAMT) FROM PROVISION_UPLOAD pup WHERE pup.PROVISIONDATE < :reportDate AND pup.FACID = ds.FACID) AS prov, 
    SUM(ds.FACILITYSECURITYAMOUNT), 
    SUM(ds.PROVISIONAMOUNTCFWD) 

FROM 
    DAILY_SUMMARY ds 

WHERE 
    ds.SUMMARY_DATE = '10-FEB-15' AND 
    ds.FACSTS IN('F','L','A') AND 
    ds.PERSTS = 'N'; 

Aber jetzt das Problem ist die Integration dieser zwei Abfragen mit dem Master-er Jahren diejenigen, die sich zu holen Abfrage, gibt es den Fehler -

keine Gruppenfunktion für eine Gruppe

bedeutet, dass GROUP BY erforderlich ist. Ich habe versucht, die Gruppierung und erzeugen auch den vorgeschlagenen Gruppe SQL Developer durch, aber es ist ungenau, da es unvollständig ist -

group by COUNT(DISTINCT, COUNT(ds.FACID), (SUM(ds.NETARREARS), (SELECT,SUM(ds.INCOMESUSPENSE), 
SUM(ds.VATSUSPENSE), SUM(ds.PREPAIDDEPOSIT), SUM(ds.NETFUTURE), SUM(ds.NETEXPOSURE), (SELECT 

Gerade FYI - die Master-Abfrage funktioniert gut, wenn die Gruppe durch Klausel und die neuen 2-Abfragen kommentiert werden.

Kann mir jemand dabei helfen?

UPDATE - Probenergebnisse Screenshot

Sample result

+1

Sie sollten Beispieldaten und gewünschte Ergebnisse bereitstellen. –

+0

Sie sollten Beispieldaten und gewünschte Ergebnisse bereitstellen. –

+0

ist das noch offen? Ich verstehe nie, warum Selektoren in der Auswahlliste zu verwenden ... – Thomas

Antwort

0

Das Problem ist, dass Ihre Unterabfragen sind Correlated Subqueries:

(SELECT sum(pup.PROVISIONAMT) 
FROM PROVISION_UPLOAD pup 
WHERE pup.PROVISIONDATE < :reportDate AND 
     pup.FACID = ds.FACID 
-------------------^ 
) AS prov, 

Diese Korrelation Klausel verwendet ds.FACID. Diese Spalte ist jedoch nicht verfügbar nach aggregieren.

Ich bin nicht sicher, welche Ergebnisse Sie wirklich wollen, also ist es schwierig, eine Lösung vorzuschlagen. Vielleicht möchten Sie eine weitere Referenz auf ds in der Unterabfrage, im Gegensatz zu einer korrelierten Unterabfrage.

+0

Ich debuggte das Programm mit der vorherigen Version - vor dem Löschen der Spalten und bekam diesen Datensatz. Dies läuft innerhalb einer for-Schleife.Dies ist das ursprüngliche Ergebnis, das ich erwarte (wie in Frage 1 meiner Frage). [2, 4, 1577670.0, 1025977.03, 382470.51, 72444.0, 0.0, 6840996.0, 6937774.46, 0.0, 0.0, 1368234.28] –