我在Access中有一个表,其中列出了属性ID以及每个都经过认证的年份:
B_ID CertYear
a 2016
b 2016
c 2015
a 2015
a 2014
我想创建一个查询/表格,它将计算每个建筑物已经过认证的年数,并且每年在不同的列中列出如下所示:
B_ID Count_CertYear Detail_CertYear
a 3 2016|2015|2014
b 1 2016
c 1 2015
在查询设计中,我能够计算前两列,但无法弄清楚如何进行第三列。以下是我目前如何制作表格。
Field: B_ID B_ID
Table: MyTable MyTable
Total: Count Count
Sort:
Show:
Criteria:
Or:
答案 0 :(得分:0)
Access确实附带了一组域聚合函数,Count(),Sum(),Avg(),First(),Last(),Min(),Max(),StDev(),StDevP(),但是,Var()和VarP()没有本机域串联功能。
我的偏好是在SQL服务器中处理这个并通过存储过程返回结果,但如果你只限于Access,那么使用Patrick Matthews的域连接函数here是你最好的选择。
来自DConcat()的文档:
SELECT DConcat("Account","Sample") AS Accounts
FROM Sample
GROUP BY DConcat("Account","Sample");
Returns:
Accounts
-----------------------------------------------------------------------------
Acct1, Acct10, Acct2, Acct3, Acct4, Acct5, Acct6, Acct7, Acct8, Acct9
对于您问题中的具体示例:
SELECT B_ID
, COUNT(Cert_Year)
, DConcat("CertYear","MyTable", "B_ID='" & [B_ID] & "'") AS Detail_CertYear
FROM MyTable
GROUP BY B_ID
应该返回这些值:
B_ID Count_CertYear Detail_CertYear
------------------------------
a 3 2016,2015,2014
b 1 2016
c 1 2015
答案 1 :(得分:0)
要在Access中执行此操作,您可以使用交叉表查询,也可以使用函数根据B_ID连接年份。
你说你想“每年在单独的列中列出”,所以我认为交叉表更适合你。
以下是交叉表SQL:
TRANSFORM Min(t.[CertYear]) AS MinOfCertYear
SELECT t.[B_ID], Count(t.[CertYear]) AS [TotalYears]
FROM (
SELECT
t1.B_ID,
t1.CertYear,
COUNT(t2.ID) AS YearCount
FROM YourTable t1
INNER JOIN YourTable t2
ON t1.B_ID = t2.B_ID
AND t1.ID <= t2.ID
GROUP BY t1.B_ID, t1.CertYear
) t
GROUP BY t.[B_ID]
PIVOT 'Year: ' & t.[YearCount];
如果您只想在逗号分隔的单个列中返回年份,则可以使用找到的函数here作为常规聚合查询的一部分。
然后,您的SQL将是:
SELECT
t1.B_ID,
COUNT(t1.ID) AS YearCount,
SimpleCSV("SELECT t3.CertYear FROM YourTable t3 WHERE t3.B_ID = '" & t1.B_ID & "'") AS [Years]
FROM YourTable t1
GROUP BY t1.B_ID