Ms-Access

別名列的總計

  • November 9, 2017

我在 MS Access 中有一個表,其中包含以下欄位/數據:

學校編號 傳統形式 陪練 傳統武器 戰鬥武器
------------- ----------------- --------------- ------------------- ---------------
2598 
3286 第二次競爭沒有競爭第二次
第1642章 競爭沒競爭第三沒競爭
1642 3rd 3rd 2nd 競爭
3116 第一第一第一第一
第2598章 爭二沒爭三
第2396章 不競爭 競爭 不競爭 競爭
3286 競爭 競爭 競爭 3rd
3116 第一第一第一第一
第3169章 不競爭 不競爭 競爭 競爭

我有一個查詢,將按學校計算個人條目,如下所示:

SELECT [tourney report].[School Number], COUNT([School Number]) as Entries
FROM [tourney report]
WHERE (Sparring IN ('1st','2nd','3rd','Competed') OR [Traditional Forms] IN ('1st','2nd','3rd','Competed') )
GROUP BY [School Number]

這給了我每所學校在陪練或表格中的條目總數。我可以對其他每個類別(武器/戰鬥武器)重複這一點。我想得到的是一個組合查詢,它顯示每所學校的總條目,這是每個表格/陪練(表格和陪練算作一個實體)、武器、戰鬥總數的總和。例子:

School number   Forms/Sparring  Weapons Combat  Total Entries
1234                22            15      20       57

我的進一步嘗試導致將以下查詢放在一起,這為我提供了我需要的大部分內容:

SELECT [tourney report].[School Number], 
      SUM( IIF( ([tourney report].[Traditional Forms] = "Did Not Compete" OR LEN([tourney report].[Traditional Forms]) = 0) AND ([tourney report].[Sparring] = "Did Not Compete" OR LEN([tourney report].[Sparring]) = 0) , 0, 1) ) AS [Total Form and Sparring],
      SUM( IIF( ([tourney report].[Traditional Weapons] = "Did Not Compete" OR LEN([tourney report].[Traditional Weapons]) = 0), 0, 1) ) AS [Total Weapons],
      SUM( IIF( ([tourney report].[Combat Weapons] = "Did Not Compete" OR LEN([tourney report].[Combat Weapons]) = 0), 0, 1) ) AS [Total Combat]
FROM [tourney report]
GROUP BY [School Number]

這給了我想要的每個類別的總數,但不是總數。我嘗試了以下方法:

SUM( [Total Form and Sparring] + [Total Weapons] + [Total Combat]) as [All Entries]

然而,這給出了錯誤

子查詢不能在表達式中使用(SUM(

$$ Total Form and Sparring $$+$$ Total Weapons $$+$$ Total Combat $$) 作為$$ All Entries $$)

如何將所有總和列的總數作為第四個總數?

我不確定 Access 是否支持這個,但通常 SQL 允許您在派生表的幫助下解決這個問題。如果您將目前查詢用作派生表,則可以簡單地通過別名引用它公開的所有計算列,如下所示:

SELECT
 [School number],
 [Total Form and Sparring],
 [Total Weapons],
 [Total Combat],
 [Total Form and Sparring] + [Total Weapons] + [Total Combat] AS [Total Entries]
FROM
 (  /* this is the query that gives you most of what you need */
   SELECT
     [tourney report].[School Number], 
     SUM( IIF( [tourney report].[Traditional Forms]   IN ('', 'Did Not Compete')
           AND [tourney report].[Sparring]            IN ('', 'Did Not Compete'), 0, 1) ) AS [Total Form and Sparring],
     SUM( IIF( [tourney report].[Traditional Weapons] IN ('', 'Did Not Compete'), 0, 1) ) AS [Total Weapons],
     SUM( IIF( [tourney report].[Combat Weapons]      IN ('', 'Did Not Compete'), 0, 1) ) AS [Total Combat]
   FROM
     [tourney report]
   GROUP BY
     [School Number]
 ) AS derived

您可以看到聚合結果都作為它們自己的列返回,並用於創建另一個計算列,即所有條目的總數。

如您所見,通過上述查詢,我還冒昧地稍微重寫了您的條件。我只是想讓它們更緊湊。但是,我也不完全確定 Access 是否會接受這種語法。如果沒有,您可以隨時將語法還原為您的語法。

引用自:https://dba.stackexchange.com/questions/190440