2017-05-31 6 views
-1

以下のコードでは、すべての固有のFundIdの月末値のみを選択しようとしています。次のコードは、私にエラーを与え続けます各識別子の月末値

メッセージ164、レベル15、状態1、行16 各GROUP BY式には、少なくとも1つの外部参照でない列が含まれている必要があります。

はどうすれば文はそれぞれのすべての月末値を引っ張っている。これは、クエリで

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

は、あなたのDBMSのタグを追加 – Jens

答えて

1

をfundid修正することができます:

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) 
        ); 

は賢明な表の別名を使用することを学ぶので、クエリがあります書きやすく読みやすい。いずれの場合においても

、あなたのWHERE句は、GROUP BYの表を参照しています。メッセージはかなり明確です。

私はあなたが何をしたいのかさえわからないんだけど、私は、これはあなたが何をしたいの作業バージョンであることを推測しています:

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;