如何在2 COUNT()SQL Server之间进行比较

时间:2017-12-15 07:02:24

标签: sql sql-server count

我有一张这样的表:

# l = [0, 1]                                 # just one dimension!
l = [[0, 1], [0, 1]]                         # two dimensions
j = [np.array([0,1]), np.array([0, 1])]      # two dimensions

我想按名称计算多少数据分区,然后将其与仅获利的数据进行比较。所以,从上面的数据我会得到这样的结果:

Name   Profit
==============
A       50
A       -10
A       60

请帮我解决这个问题。提前谢谢。

3 个答案:

答案 0 :(得分:1)

我认为简单的GROUP BY查询应该有效:

SELECT
    Name,
    COUNT(*) AS Total,
    SUM(CASE WHEN Profit > 0 THEN 1 ELSE 0 END) AS Profit,
    100.0 * SUM(CASE WHEN Profit > 0 THEN 1 ELSE 0 END) / COUNT(*) AS Percentage
FROM yourTable
GROUP BY
    Name;

查询中唯一可能不能解释的部分是CASE表达式的总和。对于具有相同名称的每组记录,该总和计算Profit具有非零值的次数。这种技术称为条件聚合,我们在计算百分比时也会重复使用这一总和。

答案 1 :(得分:1)

蒂姆答案的某种增强版本(即消除计算重复):

SELECT Name, Total, Profit, 100 * Profit / Total AS Percentage
FROM (SELECT Name,
             COUNT(*) AS Total,
             SUM(CASE WHEN Profit > 0 THEN 1 ELSE 0 END) AS Profit
      FROM yourTable
      GROUP BY Name) q;

引擎可以优化补充,但主要是为了可读性和可维护性(在计算需要改变的情况下)。在这种情况下,没有太大的收益,因为它只有一次重复,但在你重复几次的情况下,这个解决方案变得更有用。

如果可维护性不明确,那么让我们说公司的盈利能力定义发生了变化,现在我们考虑> 10才有利可图。在Tim的查询中,您必须将每个计算从> 0更改为> 10。在上面的查询中,您只需要在一个地方进行更改。

答案 2 :(得分:0)

试试这个

declare @t table
(
    Name varchar(10),
    Profit int
)
insert into @t
values('A',50),('A',60),('A',-10)

SELECT
    Name,
    Profit = SUM(CASE WHEN Profit>0 THEN 1 ELSE 0 END),
    Total = COUNT(1),
    Average = (SUM(CASE WHEN Profit>0 THEN 1.0 ELSE 0.0 END)/COUNT(1))*100
    FROM @t
    GROUP BY Name