2016-08-19 35 views
0

我已经探索并发现了许多不同的示例,但其中没有一个似乎可行。我得到的最接近的是over(),但由于语法错误而失败。计算总和中的小计的比例

考虑以下查询。

select Id, 
    count(*) as Count, 
    sum(Amount) as Sum 
from MyTable 
group by Id 

结果是标识 s的出现的金额值的数量和名单。这很好。不过,我还想说明每个总和的总和有多大。我试过以下。

select Id, 
    count(*) as Count, 
    sum(Amount) as Sum, 
    sum(Amount)/sum(Amount) over() as Ratio 
from MyTable 
group by Id 

它失败,我不知道如何解决它(主要是因为超过啄更多的是猜测比稳定的知识)。

回答

2

您需要检索总量的所有记录,你可以用下面的操作:

SELECT sum(Amount) FROM MyTable

,并把那在您的查询的除数为sum(Amount)。因此,您的查询看起来象下面这样:

select Id, 
     count(*) as Count, 
     sum(Amount) as Sum, 
     sum(Amount)/(SELECT sum(Amount) FROM MyTable) as Ratio 
from  MyTable 
group by Id 

如果您Amount数据类型是INT,您可能需要转换比率为decimal数据类型。例如:

select Id, 
     count(*) as Count, 
     sum(Amount) as Sum, 
     CAST (sum(Amount) AS NUMERIC(10,2))/(SELECT sum(Amount) FROM MyTable) as Ratio 
from  MyTable 
group by Id 

[编辑]:如果你想使用OVER条款,我建议你多了一个子查询:

SELECT [Id], [Count], [Sum], [SUM]/SUM([SUM]) OVER (PARTITION BY 1) 
FROM 
(
     select Id, 
        count(*) as Count, 
        sum(Amount) as Sum    
     from  MyTable 
     group by Id 
) as t 
+0

很好的建议。然而,在我的具体情况下,子查询将是巨大的(连接,轮子,子子选择等)。我希望有一个懒惰的男人解决方案,嘿嘿。可以使用* over * thingy来完成吗? –