我有一张这样的表:
# 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
请帮我解决这个问题。提前谢谢。
答案 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