2017-09-24 25 views
2

我有以下作爲保存的查詢「qGetClubPoints」派生從保存的查詢變換的查詢不能識別字段MS-ACCESS

SELECT t1.[season], t1.evIndex, t1.Category, t1.runner, 
    t1.runnerName, t1.ClubID, t1.ClubPoints, t2.CategoryGroupID 
FROM 
    League AS t1 INNER JOIN 
    [Categories] AS t2 
    ON t1.category = t2.category 
WHERE 
    t1.[season]>=2017 
AND 
    t1.[runner] IN 
    (
     SELECT TOP 4 runner FROM [league] as t11 
      INNER JOIN [Categories] as t12 
      ON t11.category = t12.category 
     WHERE t11.evIndex=t1.evIndex 
      AND t11.clubID=t1.ClubID 
      AND t12.CategoryGroupID=t2.CategoryGroupID 
     ORDER BY ClubPoints DESC, runner DESC 
    ) 
ORDER BY t1.evIndex, t1.ClubID, t2.CategoryGroupID, t1.ClubPoints DESC 

上述查詢產生每俱樂部點根據每個類別的頂部4的結果組每個事件。當我運行上面的查詢時,我得到了預期的結果。 現在我想從上面的結果

TRANSFORM sum(ClubPoints) SELECT ClubID FROM qGetClubPoints GROUP BY ClubID PIVOT evIndex 

但是執行透視表,我得到一個錯誤:

Microsoft Access數據庫引擎無法識別「t1.evIndex」作爲有效的字段名或表達

它看起來如在查詢中的內部參數如t11.evIndex=t1.evIndex當查詢被用作樞軸表源不被認可。

+1

我可以在Access 2016下複製此行爲(可能是優化器的行爲,以前有問題)。然而,從用戶自定義函數中包裝'WHERE'查詢來看,我想不出一個解決方法。如果你對如何做到這一點感興趣,我可以向你展示。 –

+0

我正在通過ASP.NET網站運行查詢,我不確定我能在這裏使用用戶定義的函數 –

+0

不,不幸的是,您不會。另一種方法是將你的'IN'子句移動到'FROM'子句並將其加入,並將'IN'子句中的'WHERE'子句移動到'ON'子句。 (你可能必須去嵌套子查詢才能使用'TOP',並且我不能100%確定它是可能的)。 –

回答

0

嘗試將「qGetClubPoints」記錄集寫入表中;然後將您的數據透視查詢應用於此表。

醜但可能工作

+0

不幸的是,這正是我最終做的。由於值不會經常更改(每月一次/兩次),因此無論何時重新計算,它都會將查詢的最終結果推送到表中作爲交叉表的源。無賴! –

+0

使用便箋式臨時表並不是世界上最糟糕的事......在一些棘手的設計中,比如你的 - 它往往是唯一的方法。一個很好的事情是在臨時表中的數據的可見性可以幫助成爲一個測試點,看到結果中間流...... –