Return 邮编县学生名单

Return list of Students by ZipCode Count

我正在尝试获取居住在同一邮政编码中且邮政编码计数 > 1 的学生列表。

我尝试了以下方法,但在我的查询中没有得到任何结果。如果我删除 s.Student,我会得到邮政编码和计数的结果,但我也想包括学生。

SELECT s.Student, z.ZipCode, COUNT(s.ZipCodeId) As 'Zip Code Count'
FROM Students s
INNER JOIN ZipCodes z ON z.ZipCodeId = s.ZipCodeId
GROUP BY s.Student, z.ZipCode
HAVING COUNT(z.ZipCode) > 1

下面是我正在使用的数据库表。

CREATE TABLE [dbo].[Instructors](
    [InstructorId] [int] IDENTITY(1,1) NOT NULL,
    [Instructor] [varchar](50) NOT NULL,
    [ZipCodeId] [int] NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Students](
    [StudentId] [int] IDENTITY(1,1) NOT NULL,
    [Student] [varchar](50) NOT NULL,
    [ZipCodeId] [int] NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ZipCodes](
    [ZipCodeId] [int] IDENTITY(1,1) NOT NULL,
    [ZipCode] [varchar](9) NULL,
    [City] [varchar](50) NULL,
    [State] [varchar](25) NULL
) ON [PRIMARY]

我认为您需要查询多次使用的邮政编码,然后加入学生以及邮政编码详细信息,例如

SELECT S.Student, Z.ZipCode, Z1.Num AS "Zip Code Count"
FROM (
    SELECT COUNT(*) Num, ZipCodeId
    FROM Students S
    GROUP BY ZipCodeId
    HAVING COUNT(*) > 1
) Z1
INNER JOIN Students S on S.ZipCodeId = Z1.ZipCodeId
INNER JOIN ZipCodes Z on Z.ZipCodeId = Z1.ZipCodeId;

注意:您不使用单引号 (') 来分隔列名称 - 您使用双引号 (") 或方括号 ([])。

此外,示例数据将允许测试我们的解决方案。

您可以使用 window 函数执行此操作, 无需 re-joining

SELECT
  S.Student,
  Z.ZipCode,
  Z.Num AS [Zip Code Count]
FROM (
    SELECT *,
      COUNT(*) OVER (PARTITION BY S.ZipCodeId) Num
    FROM Students S
) S
INNER JOIN ZipCodes Z on Z.ZipCodeId = S.ZipCodeId
WHERE S.Num > 1;