SQL Server中的百分比列

时间:2019-01-28 13:20:50

标签: sql sql-server

感谢您为我提供的所有帮助。 我需要在SQL中的百分比列。我尝试了两种方法但无法获得。

SELECT distinct(v_GS_COMPUTER_SYSTEM_Alias.Model0) AS latitudeModels,
       count(v_GS_COMPUTER_SYSTEM_Alias.Model0) AS COUNT,
  (SELECT sum(count(*))
   FROM v_GS_COMPUTER_SYSTEM v_GS_COMPUTER_SYSTEM_Alias
   WHERE v_GS_COMPUTER_SYSTEM_Alias.Model0 LIKE '%Latitude%'
   GROUP BY v_GS_COMPUTER_SYSTEM_Alias.model0)
FROM v_GS_COMPUTER_SYSTEM v_GS_COMPUTER_SYSTEM_Alias
WHERE v_GS_COMPUTER_SYSTEM_Alias.Model0 LIKE '%Latitude%'
GROUP BY v_GS_COMPUTER_SYSTEM_Alias.model0

使用子查询以iam的百分比获取数据

    Msg 130, Level 15, State 1, Line 4
Cannot perform an aggregate function on an expression containing an aggregate or a subquery.

现在使用第二个查询进行iam,但是iam查找所有100%的列到%的列

SELECT distinct(v_GS_COMPUTER_SYSTEM_Alias.Model0) AS latitudeModels,
       count(v_GS_COMPUTER_SYSTEM_Alias.Model0) AS COUNT,
       (count(v_GS_COMPUTER_SYSTEM_Alias.Model0) / count(*) * 100) AS percent1
FROM v_GS_COMPUTER_SYSTEM v_GS_COMPUTER_SYSTEM_Alias
WHERE v_GS_COMPUTER_SYSTEM_Alias.Model0 LIKE '%Latitude%'
GROUP BY v_GS_COMPUTER_SYSTEM_Alias.model0
ORDER BY v_GS_COMPUTER_SYSTEM_Alias.model0

其给出的数据为

    latitudeModels  count   percent1
Latitude 5179   7   100
Latitude 5250   1   100
Latitude 5285   6   100
Latitude 5289   1   100
Latitude 5290   2226    100
Latitude 5290 2-in-1    57  100
Latitude 5480   10440   100
Latitude 5490   2235    100
Latitude 5580   47  100
Latitude 7280   1125    100
Latitude 7290   28  100
Latitude 7370   2   100
Latitude 7380   8   100
Latitude 7390   150 100
Latitude 7480   13  100
Latitude 7490   6   100
Latitude E4200  1   100
Latitude E4300  9   100
Latitude E4310  11  100
Latitude E5250  945 100
Latitude E5270  1665    100
Latitude E5440  18  100
Latitude E5450  4260    100
Latitude E5470  5231    100
Latitude E6220  13  100
Latitude E6230  33  100
Latitude E6320  256 100
Latitude E6330  671 100
Latitude E6400  15  100
Latitude E6410  42  100
Latitude E6420  370 100
Latitude E6430  546 100
Latitude E6440  3071    100
Latitude E64406349K0135/    1   100
Latitude E6540  1   100
Latitude E7240  283 100
Latitude E7250  763 100
Latitude E7270  1565    100
Latitude E7440  1582    100

我全力以赴100%您能帮忙吗

enter image description here

2 个答案:

答案 0 :(得分:1)

好像有几个问题要解决。正如jarlh在评论中所说,您不需要在SELECT DISTINCT中使用GROUP BY,因为GROUP BY不会返回重复的行。其次,您不应将关键字用作列别名,因此应将count更改为countRows或其他未保留的内容。

当前的问题是您正在使用COUNT,它返回数据类型INT。你会 需要将该值转换为DECIMAL数据类型以返回所需的值。以下应返回您在Percent列中所需的值。

select v_GS_COMPUTER_SYSTEM_Alias.Model0 as latitudeModels,
count(v_GS_COMPUTER_SYSTEM_Alias.Model0) as countRows,
((CAST(count(v_GS_COMPUTER_SYSTEM_Alias.Model0) AS DECIMAL) / CAST(count(*) AS DECIMAL)) * 100) as percent1
from  v_GS_COMPUTER_SYSTEM v_GS_COMPUTER_SYSTEM_Alias  
Where  v_GS_COMPUTER_SYSTEM_Alias.Model0 like '%Latitude%' group by v_GS_COMPUTER_SYSTEM_Alias.model0
order by v_GS_COMPUTER_SYSTEM_Alias.model0

根据您的评论,我添加了以下查询。为了保持准确性,您需要将所有COUNT调用都强制转换为十进制,否则只会返回整数。请尝试以下操作:

SELECT a.model0,
       CAST(CAST(count(*) AS DECIMAL)/CAST((SELECT count(model0) AS cnt FROM v_GS_COMPUTER_SYSTEM a WHERE a.Model0 LIKE '%Latitude%') AS DECIMAL)) *100 AS DECIMAL(18,5)) AS percent1 
FROM v_GS_COMPUTER_SYSTEM a WHERE a.Model0 LIKE '%Latitude%' GROUP BY a.model0

答案 1 :(得分:0)

您正在尝试将100乘以分母。

SELECT DISTINCT(v_GS_COMPUTER_SYSTEM_Alias.Model0) AS latitudeModels,
count(v_GS_COMPUTER_SYSTEM_Alias.Model0) as count,
(CAST(count(v_GS_COMPUTER_SYSTEM_Alias.Model0) AS DECIMAL) / CAST(count(*) AS DECIMAL)) * 100 as percent1
 from  v_GS_COMPUTER_SYSTEM v_GS_COMPUTER_SYSTEM_Alias  
 Where  v_GS_COMPUTER_SYSTEM_Alias.Model0 like '%Latitude%' 
 group by v_GS_COMPUTER_SYSTEM_Alias.model0
 order by v_GS_COMPUTER_SYSTEM_Alias.model0