2016-03-10 96 views
1

我有一张这样的表格,我想从中计算每个用户名的重复次数。我想算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 | 
+----------+---------------+ 

..where [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但它没有产生预期的结果。

回答

3

使用COUNT DISTINCTCASE

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

的不同使用WHERE条款是,这将返回0 DistinctCount行,而WHERE条款不会。

DEMO

+0

谢谢!太棒了! – Shanka

+0

这也是最糟糕的解决方案,不是吗?它效率低下,因为你正在考虑所有的行,即使是零。我敢打赌,这在大多数用例中会恶化...... –

+0

@MattG,也许。但是这与使用'WHERE'条件的你和Backtrack的解决方案完全不同。如果他打算排除0行,那么WHERE条款是正确的,这是错误的。否则,这是唯一正确的解决方案。 –

3

根据您的输出,您需要每个用户名一行。这意味着你想按用户名分组。你想通过用户名统计不同类型的数量,并且有一个聚合函数。使用用户名在Wheregroup by

SELECT username, 
      COUNT(DISTINCT Type) as counted 
FROM  tblBase 
WHERE  Amount <> 0 
GROUP BY username 
3
SELECT Username, COUNT(DISTINCT Type) AS DistinctCount 
    FROM tblBase WHERE Amount <> 0 
    GROUP BY Username 

我会说,使用量<> 0:试试这个。并使用distinct得到计数