Sql server 在SQL SERVER中计算列的整数百分比?

Sql server 在SQL SERVER中计算列的整数百分比?,sql-server,Sql Server,我刚刚开始试验如何计算一行的百分比。这是我写的代码 SELECT DISTINCT ServiceName COUNT(serviceID) AS Services FROM Tester_DW WHERE DateToday=20150410 GROUP BY ServiceName 如何计算上述列服务的百分比,并将百分比设置为整数?如果我将查询结果放在临时表中并从临时表中计算百分比,那么计算代码示例的百分比会更容易吗?或者可以动态计算整数百分比吗 添加:输出草图 ServiceName|S

我刚刚开始试验如何计算一行的百分比。这是我写的代码

SELECT DISTINCT
ServiceName
COUNT(serviceID) AS Services
FROM Tester_DW
WHERE DateToday=20150410
GROUP BY ServiceName
如何计算上述列服务的百分比,并将百分比设置为整数?如果我将查询结果放在临时表中并从临时表中计算百分比,那么计算代码示例的百分比会更容易吗?或者可以动态计算整数百分比吗

添加:输出草图

ServiceName|Services| % of Total
--------------------------------
TV-cable   |  4500  |   40%
--------------------------------
Mobile BB  |  3000  |   10%
--------------------------------
MOBILE wifi|    20  |    5%
--------------------------------

您只需将单个服务的计数除以所有服务的数量。

百分比是一个计数除以总引用计数。您必须使用内部查询来获取总计数:

SELECT ServiceName, COUNT(serviceID) AS Services, 
FLOOR(COUNT(serviceID) / (SELECT COUNT(serviceID) FROM Tester_DW)) AS percent
FROM Tester_DW WHERE...

根据您想要的输出(即引用计数),您可能还必须在内部查询中添加WHERE子句或其中的一部分。

很难正确获得它,因为您应该处理舍入整数百分比之和,以获得100%的总数

使用


尝试使用窗口功能:

 Create table t(id int)
 Insert into t values
(1),(1),(2)

 Select * from (Select id,
 100.0*count(*) over(partition by id)/ count(*) over() p
 from t) t
 Group by id, p

你能提供样品数据和预期输出吗?你是如何得到40%的电视电缆的?这是根据组中没有日期过滤器的行总数计算的吗?这40%只是这个草图的一个虚构数字。基本上,无论服务总量加起来是多少,当计算服务总量的百分比时。如果你看一下百分比,没有一个单独的总数可以得到所描述的百分比OP@ughai我的答案是朝着正确的方向推进,并且很容易适应原始海报的全部需求。正如我所说的,取决于你想要的输出,也就是说,你的参考计数是多少…如果你看一下百分比,没有一个单独的总数可以得到OPC描述的百分比,这是一个很好的例子。但是,使用上述百分比查询从代码生成的百分比仅返回98%。加起来还不到100%。在数据库中计算百分比时,这是一个正常问题吗?通过使用整数值,点后的数字被截断,计数产生整数,因此结果是整数;如果您不想这样做,则必须在%-列中使用CAST CountServiceName*100作为浮点。此外,如果使用主select命令,则可能需要通过WHERE子句限制子select的总计数。
;WITH x AS 
(
    SELECT 
        ServiceName, 
        COUNT(*) * 100.0 / SUM(COUNT(*)) OVER () AS [Percent], 
        FLOOR(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER ()) AS [IntPercent], 
        COUNT(*) * 100.0 / SUM(COUNT(*)) OVER () % 1 AS [Remainder]
    FROM Tester_DW
    GROUP BY ServiceName
)
SELECT ServiceName, IntPercent + CASE WHEN Priority <= Gap THEN 1 ELSE 0 END AS IntPercent
FROM
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY Remainder DESC) AS Priority, 100 - SUM(IntPercent) OVER () AS Gap FROM x
) data
 Create table t(id int)
 Insert into t values
(1),(1),(2)

 Select * from (Select id,
 100.0*count(*) over(partition by id)/ count(*) over() p
 from t) t
 Group by id, p