从包含多年度参会者信息的多张表中,获取所有参会者及其注册代码,并在列头为year-attended的一列中显示

编程语言 2026-07-12

所以我有这场展会5年的注册数据。我想要一份在这5年内曾经出席过的所有人名单,表中把他们的注册码放在一列,出席的年份放在表头的顶端。

所以输出应该长成下面这样的样子:

姓名 邮箱 2022 2023 2024 2025 2026
乔·安德森 [email protected] AT AT AT BD BD
简·约翰逊 [email protected] BG
弗雷德·琼斯 [email protected] F F F
约翰·史密斯 [email protected] CR CR CR

以下是给定的表格:

[2022_show].[dbo].[regs]:

电子邮件 注册码
安德森 [email protected] AT
史密斯 约翰 [email protected] CR

[2023_show].[dbo].[regs]:

电子邮件 注册码
安德森 [email protected] AT
琼斯 弗雷德 [email protected] F
史密斯 约翰 [email protected] CR

[2024_show].[dbo].[regs]:

电子邮件 注册码
安德森 [email protected] AT
史密斯 约翰 [email protected] CR

[2025_show].[dbo].[regs]:

电子邮件 注册码
安德森 [email protected] BD
约翰逊 [email protected] BG
琼斯 弗雷德 [email protected] F

[2026_show].[dbo].[regs]

电子邮件 注册码
安德森 [email protected] BD
琼斯 弗雷德 [email protected] F

显然,当他们的姓、名和电子邮件字段三者都相同时,才算是一对一年的匹配。如果三者中的任意一项不同,那在输出中就会出现新的一行。所以,是的,我知道如果乔·安德森在一年到下一年改变了电子邮件,那他会被视为新的人——这没问题。

有些人跳过了某一年,有些人每年都来,有些人只参加过一个年份,有些人的注册码在不同年份之间不同。

我知道我需要 UNION 把所有这些表合并在一起,但棘手的部分是让那些出席年份的列按我想要的方式工作。我就是搞不定该怎么实现。

解决方案

Mistake #1: "I have multiple tables"。这是一个完全错误的数据库设计。而且你不仅仅只有多张表,实际你有的是多个 数据库。你需要把它们合并成一个表,并添加一个 year 列,这样查询就会容易得多。


话虽如此,你可以使用全连接(FULL JOIN),也可以使用UNION再配合GROUP BY来把所有表合并起来。正如前文所述,UNION在某种程度上本该是它最初的样子。具体哪个更快或更慢,取决于具体情况。

SELECT
    CONCAT_WS(' ', t.last_name, t.first_name) AS name,
    t.email,
    MIN(CASE WHEN t.year = 2022 THEN t.reg_code END) AS [2022],
    MIN(CASE WHEN t.year = 2023 THEN t.reg_code END) AS [2023],
    MIN(CASE WHEN t.year = 2024 THEN t.reg_code END) AS [2024],
    MIN(CASE WHEN t.year = 2025 THEN t.reg_code END) AS [2025],
    MIN(CASE WHEN t.year = 2026 THEN t.reg_code END) AS [2026]
FROM
(
    SELECT 2022 AS year, * FROM [2022_show].dbo.regs
    UNION ALL
    SELECT 2023, * FROM [2023_show].dbo.regs
    UNION ALL
    SELECT 2024, * FROM [2024_show].dbo.regs
    UNION ALL
    SELECT 2025, * FROM [2025_show].dbo.regs
    UNION ALL
    SELECT 2026, * FROM [2026_show].dbo.regs
) t
GROUP BY
    t.last_name,
    t.first_name,
    t.email;
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章