根据多列中的条件计算不同的值
Count distinct values based on criteria in multiple columns
我有一个像这样的 table,我想从中计算每个用户名的重复次数。我想计算每个用户有多少不同的 Type
Amount <> 0
:
+----------+-------------+--------+
| Username | Type | Amount |
+----------+-------------+--------+
| abc | New | 1 |
| abc | New | 1 |
| abc | Old | 1 |
| def | New | 1 |
| def | Old | 0 |
| def | Refurbished | 1 |
| ijk | New | 1 |
| ijk | Old | 2 |
| ijk | Refurbished | 3 |
+----------+-------------+--------+
我的结果应该是这样的:
+----------+---------------+
| Username | DistinctCount |
+----------+---------------+
| abc | 2 |
| def | 2 |
| ijk | 3 |
+----------+---------------+
..其中 [Username] abc
有 2 distinct [Type]
和 [Amount] not equal to 0
.
我已经尝试 SELECT DISTINCT Type, Username, SUM(CASE WHEN Amount <> 0 THEN 1 ELSE 0 END) FROM tblBase GROUP BY Type, Username
但没有产生预期的结果。
根据您的输出,您希望每个用户名占一行。这意味着你想按用户名分组。你想通过用户名计算不同类型的数量,并且有一个聚合函数。试试这个:
SELECT username,
COUNT(DISTINCT Type) as counted
FROM tblBase
WHERE Amount <> 0
GROUP BY username
SELECT Username, COUNT(DISTINCT Type) AS DistinctCount
FROM tblBase WHERE Amount <> 0
GROUP BY Username
我会说,在 Where
和 group by
中使用 Amount <> 0 使用用户名。并使用 distinct
得到计数
将 COUNT DISTINCT
与 CASE
一起使用:
SELECT
Username,
DistinctCount = COUNT(DISTINCT CASE WHEN Amount <> 0 THEN Type END)
FROM #tbl
GROUP BY Username;
与使用 WHERE
子句的不同之处在于,这将 return 具有 0 DistinctCount
的行,而 WHERE
子句不会。
我有一个像这样的 table,我想从中计算每个用户名的重复次数。我想计算每个用户有多少不同的 Type
Amount <> 0
:
+----------+-------------+--------+
| Username | Type | Amount |
+----------+-------------+--------+
| abc | New | 1 |
| abc | New | 1 |
| abc | Old | 1 |
| def | New | 1 |
| def | Old | 0 |
| def | Refurbished | 1 |
| ijk | New | 1 |
| ijk | Old | 2 |
| ijk | Refurbished | 3 |
+----------+-------------+--------+
我的结果应该是这样的:
+----------+---------------+
| Username | DistinctCount |
+----------+---------------+
| abc | 2 |
| def | 2 |
| ijk | 3 |
+----------+---------------+
..其中 [Username] abc
有 2 distinct [Type]
和 [Amount] not equal to 0
.
我已经尝试 SELECT DISTINCT Type, Username, SUM(CASE WHEN Amount <> 0 THEN 1 ELSE 0 END) FROM tblBase GROUP BY Type, Username
但没有产生预期的结果。
根据您的输出,您希望每个用户名占一行。这意味着你想按用户名分组。你想通过用户名计算不同类型的数量,并且有一个聚合函数。试试这个:
SELECT username,
COUNT(DISTINCT Type) as counted
FROM tblBase
WHERE Amount <> 0
GROUP BY username
SELECT Username, COUNT(DISTINCT Type) AS DistinctCount
FROM tblBase WHERE Amount <> 0
GROUP BY Username
我会说,在 Where
和 group by
中使用 Amount <> 0 使用用户名。并使用 distinct
得到计数
将 COUNT DISTINCT
与 CASE
一起使用:
SELECT
Username,
DistinctCount = COUNT(DISTINCT CASE WHEN Amount <> 0 THEN Type END)
FROM #tbl
GROUP BY Username;
与使用 WHERE
子句的不同之处在于,这将 return 具有 0 DistinctCount
的行,而 WHERE
子句不会。