Access Query中记录之间的连接

时间:2017-03-29 20:09:03

标签: ms-access concatenation

我在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:     

2 个答案:

答案 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