根据多列中的条件计算不同的值

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] abc2 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

我会说,在 Wheregroup by 中使用 Amount <> 0 使用用户名。并使用 distinct 得到计数

COUNT DISTINCTCASE 一起使用:

SELECT
    Username,
    DistinctCount = COUNT(DISTINCT CASE WHEN Amount <> 0 THEN Type END)
FROM #tbl
GROUP BY Username;

与使用 WHERE 子句的不同之处在于,这将 return 具有 0 DistinctCount 的行,而 WHERE 子句不会。

DEMO