【问题标题】:MS Access SQL – How can I count the occurrence of a number from one table in strings of another tableMS Access SQL – 如何计算一个表中的数字在另一个表的字符串中出现的次数
【发布时间】:2021-09-20 19:24:25
【问题描述】:

在 MS Access 365 中,我有 2 个表,我想在第二个表的字符串的一部分中计算第一个表中一年的出现次数,纯粹使用 SQL(到目前为止,我使用 VBA,但我想简化)。

第一个表 (tDistinctYears) 包含我们的一个成员支付的所有年份:

ID PaymentYear
1 2015
2 2016
3 2017
3 2018
4 2019
5 2020
6 2021
7 2022

第二个表 (tPayments) 包含来自会员的所有付款,其中一列包含会员编号,另一列包含付款年份。有时会员支付一年,有时支付几年。因此,该表如下所示:

MembershipNr YearPayment
11 2016
11 2017
11 2018
26 2017
26 2018;2019
26 2020;2021;2022
38 2016
38 2017
38 2018;2019;2020;2021

我想要一个查询,告诉我有多少会员在哪一年支付了费用:

PaymentYear Count
2015 0
2016 2
2017 3
2018 3
2019 2
2020 2
2021 2

我使用了以下 SQL 查询,我在 stackoverflow 上找到了各种答案:

SELECT tDistinctYears.PaymentYear, (COUNT(tPayments.YearPayment)) AS [Count]
   FROM tDistinctYears
   LEFT JOIN tPayments ON tDistinctYears.PaymentYear like "*" & tPayments.YearPayment & "*"
       WHERE (tDistinctYears.PaymentYear > 0 AND tDistinctYears.PaymentYear <= YEAR(NOW()))
   GROUP BY tDistinctYears.PaymentYear;

但我得到的是:

PaymentYear Count
2015 0
2016 2
2017 3
2018 1
2019 0
2020 0
2021 0

上面的查询似乎没有使用 JOIN ON 部分中的“like”表达式。

有人可以帮帮我吗?

【问题讨论】:

    标签: sql ms-access left-join


    【解决方案1】:

    我认为你已经接近了,只需更改条件 tPayments.YearPayment 应该在第一个位置的列,tDistinctYears.PaymentYear 应该在类似运算符的内部。

    SELECT tDistinctYears.PaymentYear, (COUNT(tPayments.YearPayment)) AS [Count]
    FROM tDistinctYears
    LEFT JOIN tPayments ON tPayments.YearPayment like "*" & 
    tDistinctYears.PaymentYear
    & "*" WHERE (tDistinctYears.PaymentYear > 0 AND tDistinctYears.PaymentYear <= 
    YEAR(NOW()))
    GROUP BY tDistinctYears.PaymentYear;
    

    【讨论】:

    • 感谢 Nagib - 工作完美,虽然我不明白它背后的逻辑。我需要多研究一下才能获得完整的见解。祝你有美好的一天——你已经让我的生活变得很棒了。
    • 解释这个看数据。当你在查询中说2018 like 2018;2019 它会返回结果但是当你说2018;2019 like 2018 它不会返回数据。
    猜你喜欢
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 2011-07-13
    • 2011-07-01
    • 1970-01-01
    • 2014-05-26
    • 2021-02-20
    • 1970-01-01
    相关资源
    最近更新 更多