SQL Server:具有多个列的 GROUP BY 会产生重复的结果

yus*_*ush 0 sql sql-server

我试图将第三列包含到现有的 SQL Server 查询中,但我得到了重复的结果值。

以下是 中包含的数据的示例tb_IssuedPermits:

| EmployeeName | Current |
|--------------|---------|
| Person A     | 0       |
| Person A     | 0       |
| Person B     | 1       |
| Person C     | 0       |
| Person B     | 0       |
| Person A     | 1       |
Run Code Online (Sandbox Code Playgroud)

这是我当前的查询,它根据 1 或 0 位值生成重复值。

| EmployeeName | Current |
|--------------|---------|
| Person A     | 0       |
| Person A     | 0       |
| Person B     | 1       |
| Person C     | 0       |
| Person B     | 0       |
| Person A     | 1       |
Run Code Online (Sandbox Code Playgroud)
| EmployeeName | Count | Current |
|--------------|-------|---------|
| Person A     | 2     | 0       |
| Person B     | 1     | 0       |
| Person C     | 1     | 0       |
| Person A     | 1     | 1       |
| Person B     | 1     | 1       |
Run Code Online (Sandbox Code Playgroud)

关于如何修改查询以获得以下预期结果有什么想法吗?我想要每个结果行EmployeeName。Current如果 存在EmployeeName带有 的行,则应为 1 Current = 1,否则应为 0。

| EmployeeName | Count | Current |
|--------------|-------|---------|
| Person A     | 3     | 1       |
| Person B     | 2     | 1       |
| Person C     | 1     | 0       |
Run Code Online (Sandbox Code Playgroud)

结果不需要按任何特定顺序。

TIA

O. *_*nes 5

如果您的Current列包含字符串值'FALSE','TRUE'您可以执行此操作

SELECT EmployeeName, Count(*) AS Count, 
       MAX([Current]) AS Current
  FROM tb_IssuedPermits
 GROUP BY EmployeeName
Run Code Online (Sandbox Code Playgroud)

这是一种 hack,但它有效:如果有一组,MAX 将从每组中得到 TRUE。

如果您的Current列是 a BIT,则转换为INT并转换回来,如@ThorstenKettner建议的那样。

SELECT EmployeeName,
       Count(*) AS Count, 
       CAST(MAX(CAST([Current] AS INT)) AS BIT) AS Current
  FROM tb_IssuedPermits
 GROUP BY EmployeeName
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用条件聚合:

SELECT EmployeeName,
       Count(*) AS Count, 
       CAST(COUNT(NULLIF(Current, 0)) AS BIT) AS Current
  FROM tb_IssuedPermits
 GROUP BY EmployeeName
Run Code Online (Sandbox Code Playgroud)

  • 然后将您的位转换为整数:“MAX(CAST(current AS INT))”。 (2认同)