SQL 服务器:多列 GROUP BY 产生重复结果
SQL Server: GROUP BY with multiple columns produces duplicate results
我正在尝试将第 3 列包含到我现有的 SQL 服务器查询中,但我得到了重复的结果值。
这里是 tb_IssuedPermits
中包含的数据示例:
| EmployeeName | Current |
|--------------|---------|
| Person A | 0 |
| Person A | 0 |
| Person B | 1 |
| Person C | 0 |
| Person B | 0 |
| Person A | 1 |
这是我当前的查询,它根据 1 位或 0 位值生成重复值。
SELECT EmployeeName, COUNT(*) AS Count, [Current]
FROM tb_IssuedPermits
GROUP BY EmployeeName, [Current]
| EmployeeName | Count | Current |
|--------------|-------|---------|
| Person A | 2 | 0 |
| Person B | 1 | 0 |
| Person C | 1 | 0 |
| Person A | 1 | 1 |
| Person B | 1 | 1 |
关于如何修改我的查询以获得以下预期结果的任何想法?我想要每个 EmployeeName
一个结果行。 Current
应为 1,如果 EmployeeName
存在一行 Current = 1
,否则应为 0。
| EmployeeName | Count | Current |
|--------------|-------|---------|
| Person A | 3 | 1 |
| Person B | 2 | 1 |
| Person C | 1 | 0 |
结果不需要按任何特定顺序排列。
TIA
如果您的 Current
列包含字符串值 'FALSE'
和 'TRUE'
,您可以这样做
SELECT EmployeeName, Count(*) AS Count,
MAX([Current]) AS Current
FROM tb_IssuedPermits
GROUP BY EmployeeName
这是一个 hack,但它有效:如果有一个组,MAX 将从每个组中获取 TRUE。
如果您的 Current
列是 BIT
,转换为 INT
然后转换回来,如 所建议的那样。
SELECT EmployeeName,
Count(*) AS Count,
CAST(MAX(CAST([Current] AS INT)) AS BIT) AS Current
FROM tb_IssuedPermits
GROUP BY EmployeeName
或者,您可以使用条件聚合:
SELECT EmployeeName,
Count(*) AS Count,
CAST(COUNT(NULLIF(Current, 0)) AS BIT) AS Current
FROM tb_IssuedPermits
GROUP BY EmployeeName
你可以这样做
SELECT EmployeeName, Count(1) AS Count,SUM(CAST([Current]AS INT)) AS Current FROM tb_IssuedPermits GROUP BY EmployeeName
我正在尝试将第 3 列包含到我现有的 SQL 服务器查询中,但我得到了重复的结果值。
这里是 tb_IssuedPermits
中包含的数据示例:
| EmployeeName | Current |
|--------------|---------|
| Person A | 0 |
| Person A | 0 |
| Person B | 1 |
| Person C | 0 |
| Person B | 0 |
| Person A | 1 |
这是我当前的查询,它根据 1 位或 0 位值生成重复值。
SELECT EmployeeName, COUNT(*) AS Count, [Current]
FROM tb_IssuedPermits
GROUP BY EmployeeName, [Current]
| EmployeeName | Count | Current |
|--------------|-------|---------|
| Person A | 2 | 0 |
| Person B | 1 | 0 |
| Person C | 1 | 0 |
| Person A | 1 | 1 |
| Person B | 1 | 1 |
关于如何修改我的查询以获得以下预期结果的任何想法?我想要每个 EmployeeName
一个结果行。 Current
应为 1,如果 EmployeeName
存在一行 Current = 1
,否则应为 0。
| EmployeeName | Count | Current |
|--------------|-------|---------|
| Person A | 3 | 1 |
| Person B | 2 | 1 |
| Person C | 1 | 0 |
结果不需要按任何特定顺序排列。
TIA
如果您的 Current
列包含字符串值 'FALSE'
和 'TRUE'
,您可以这样做
SELECT EmployeeName, Count(*) AS Count,
MAX([Current]) AS Current
FROM tb_IssuedPermits
GROUP BY EmployeeName
这是一个 hack,但它有效:如果有一个组,MAX 将从每个组中获取 TRUE。
如果您的 Current
列是 BIT
,转换为 INT
然后转换回来,如
SELECT EmployeeName,
Count(*) AS Count,
CAST(MAX(CAST([Current] AS INT)) AS BIT) AS Current
FROM tb_IssuedPermits
GROUP BY EmployeeName
或者,您可以使用条件聚合:
SELECT EmployeeName,
Count(*) AS Count,
CAST(COUNT(NULLIF(Current, 0)) AS BIT) AS Current
FROM tb_IssuedPermits
GROUP BY EmployeeName
你可以这样做
SELECT EmployeeName, Count(1) AS Count,SUM(CAST([Current]AS INT)) AS Current FROM tb_IssuedPermits GROUP BY EmployeeName