2017-05-31 3 views
-1

Für den folgenden Code versuche ich nur die Monatsendwerte für alle eindeutigen FundIds auszuwählen. Der folgende Code gibt mir den FehlerNur Monatsendwerte für jeden Bezeichner

Msg 164, Ebene 15, Status 1, Zeile 16 Jeder GROUP BY-Ausdruck muss mindestens eine Spalte enthalten, die keine äußere Referenz ist.

Wie kann ich fix die where-Anweisung alle Monatsende Werte für jeden

fundid
SELECT TOP 10000 a.[PerformanceId] 
     ,[InvestmentType] 
     ,[EndDate] 
     ,a.[CurrencyId] 
     ,[AssetValue] 
     ,c.FundId 
    FROM [StatusData_DMWkspaceDB].[dbo].[NetAssetsValidationFailure] a 
    LEFT JOIN MappingData_GAPortDB.dbo.PerformanceLevelMapping b 
    ON a.PerformanceId = b.PerformanceId 
    LEFT JOIN MappingData_GAPortDB.dbo.FundClassMatching c 
    ON b.SecId = c.SecId 
    WHERE a.EndDate IN (
    SELECT MAX(a.EndDate) 
    From [StatusData_DMWkspaceDB].[dbo].[NetAssetsValidationFailure] 
    GROUP BY c.FundId, Month(a.EndDate), YEAR(a.EndDate)) 
+0

Fügen Sie den Tag für Ihre dbms – Jens

Antwort

1

Das ist Ihre Abfrage zu ziehen:

SELECT TOP 10000 navf.[PerformanceId], [InvestmentType], [EndDate], 
     navf.[CurrencyId], [AssetValue], fcm.FundId 
FROM [StatusData_DMWkspaceDB].[dbo].[NetAssetsValidationFailure] navf LEFT JOIN 
    MappingData_GAPortDB.dbo.PerformanceLevelMapping plm 
    ON navf.PerformanceId = plm.PerformanceId LEFT JOIN 
    MappingData_GAPortDB.dbo.FundClassMatching fcm 
    ON l.m.SecId = fcm.SecId 
WHERE navf.EndDate IN (SELECT MAX(navf.EndDate) 
         From [StatusData_DMWkspaceDB].[dbo].[NetAssetsValidationFailure] navf 
         GROUP BY fcm.FundId, Month(navf.EndDate), YEAR(navf.EndDate) 
        ); 

Lernen sinnvoll Tabellenaliasse zu verwenden, also die Abfrage einfacher zu schreiben und zu lesen.

In jedem Fall referenziert Ihre WHERE-Klausel nur äußere Tabellen in der GROUP BY. Die Nachricht ist ziemlich klar.

Ich bin nicht einmal sicher, was Sie tun wollen, aber ich vermute, dass dies eine funktionierende Version von dem, was Sie wollen:

SELECT x.* 
FROM (SELECT navf.[PerformanceId], [InvestmentType], [EndDate], 
      navf.[CurrencyId], [AssetValue], fcm.FundId, 
      ROW_NUMBER() OVER (PARTITION BY fcm.FundId, Month(navf.EndDate), YEAR(navf.EndDate) 
           ORDER BY navf.EndDate DESC 
           ) as seqnum 
     FROM [StatusData_DMWkspaceDB].[dbo].[NetAssetsValidationFailure] navf LEFT JOIN 
      MappingData_GAPortDB.dbo.PerformanceLevelMapping plm 
      ON navf.PerformanceId = plm.PerformanceId LEFT JOIN 
      MappingData_GAPortDB.dbo.FundClassMatching fcm 
      ON l.m.SecId = fcm.SecId 
    ) x 
WHERE seqnum = 1;