Sql server 获取数字的百分比

Sql server 获取数字的百分比,sql-server,Sql Server,我认为这是一个令人毛骨悚然的取整问题,但我不知道内部sql是如何工作的。也许有人能帮上忙 SELECT COUNT(Id) TotalReferrals, SUM(CASE WHEN NHSCommunicationNeed1_Id IS NOT NULL THEN 1 ELSE 0 END) NHSCommNeed1Total, SUM(CASE WHEN NHSCommunicationNeed2_Id IS NOT NULL THEN 1 ELSE 0 END) NHS

我认为这是一个令人毛骨悚然的取整问题,但我不知道内部sql是如何工作的。也许有人能帮上忙

   SELECT COUNT(Id) TotalReferrals,
   SUM(CASE WHEN NHSCommunicationNeed1_Id IS NOT NULL THEN 1 ELSE 0 END) NHSCommNeed1Total, 
   SUM(CASE WHEN NHSCommunicationNeed2_Id IS NOT NULL THEN 1 ELSE 0 END) NHSCommNeed2Total,
   SUM(CASE WHEN NHSCommunicationNeed3_Id IS NOT NULL THEN 1 ELSE 0 END) 
   NHSCommNeed3Total
   INTO #Totals
   FROM DDS.Referrals
给出以下结果集

TotalReferrals  NHSCommNeed1Total   NHSCommNeed2Total   NHSCommNeed3Total
1008            1008                508                 508
那么当我这么做的时候

SELECT 
   SUM((NHSCommNeed1Total / TotalReferrals) * 100) NHSCommNeed1Percent, 
   SUM((NHSCommNeed2Total / TotalReferrals) * 100) NHSCommNeed2Percent,
   SUM((NHSCommNeed3Total / TotalReferrals) * 100) NHSCommNeed3Percent
FROM #Totals
我明白了吗

NHSCommNeed1Percent NHSCommNeed2Percent NHSCommNeed3Percent
100                 0                   0

有人能解释一下发生了什么事以及我如何修复它吗?NHSCommNeed1Total/(TotalReferences的结果被计算为整数,因此它最终为0。要强制将其设为十进制或双精度,只需将其与
1.0
相乘即可:

SELECT 
   SUM((NHSCommNeed1Total / (TotalReferrals * 1.0)) * 100) NHSCommNeed1Percent, 
   SUM((NHSCommNeed2Total / (TotalReferrals * 1.0)) * 100) NHSCommNeed2Percent,
   SUM((NHSCommNeed3Total / (TotalReferrals * 1.0)) * 100) AS NHSCommNeed3Percent
FROM #Totals

是的,当然,不需要两条语句,您可以使用
INSERT-INTO-SELECT

WITH CTE
AS
(
    SELECT COUNT(Id) TotalReferrals,
       SUM(CASE WHEN NHSCommunicationNeed1_Id IS NOT NULL THEN 1.0 ELSE 0 END) NHSCommNeed1Total, 
       SUM(CASE WHEN NHSCommunicationNeed2_Id IS NOT NULL THEN 1.0 ELSE 0 END) NHSCommNeed2Total,
       SUM(CASE WHEN NHSCommunicationNeed3_Id IS NOT NULL THEN 1.0 ELSE 0 END) 
       NHSCommNeed3Total
       FROM DDS.Referrals
)
INSERT INTO SomeOtherTable(NHSCommNeed1Total,NHSCommNeed2Total ,NHSCommNeed3Total)
SELECT
  SUM((NHSCommNeed1Total / (TotalReferrals * 1.0)) * 100) AS NHSCommNeed1Percent, 
  SUM((NHSCommNeed2Total / (TotalReferrals * 1.0)) * 100) NHSCommNeed2Percent,
  SUM((NHSCommNeed3Total / (TotalReferrals * 1.0)) * 100) AS NHSCommNeed3Percent
FROM CTE;

NHSCommNeed1Total/(totalreferences
的结果被计算为整数,因此最终为0。要强制使其成为十进制或双精度,只需将其与
1.0相乘即可:

SELECT 
   SUM((NHSCommNeed1Total / (TotalReferrals * 1.0)) * 100) NHSCommNeed1Percent, 
   SUM((NHSCommNeed2Total / (TotalReferrals * 1.0)) * 100) NHSCommNeed2Percent,
   SUM((NHSCommNeed3Total / (TotalReferrals * 1.0)) * 100) AS NHSCommNeed3Percent
FROM #Totals

是的,当然,不需要两条语句,您可以使用
INSERT-INTO-SELECT

WITH CTE
AS
(
    SELECT COUNT(Id) TotalReferrals,
       SUM(CASE WHEN NHSCommunicationNeed1_Id IS NOT NULL THEN 1.0 ELSE 0 END) NHSCommNeed1Total, 
       SUM(CASE WHEN NHSCommunicationNeed2_Id IS NOT NULL THEN 1.0 ELSE 0 END) NHSCommNeed2Total,
       SUM(CASE WHEN NHSCommunicationNeed3_Id IS NOT NULL THEN 1.0 ELSE 0 END) 
       NHSCommNeed3Total
       FROM DDS.Referrals
)
INSERT INTO SomeOtherTable(NHSCommNeed1Total,NHSCommNeed2Total ,NHSCommNeed3Total)
SELECT
  SUM((NHSCommNeed1Total / (TotalReferrals * 1.0)) * 100) AS NHSCommNeed1Percent, 
  SUM((NHSCommNeed2Total / (TotalReferrals * 1.0)) * 100) NHSCommNeed2Percent,
  SUM((NHSCommNeed3Total / (TotalReferrals * 1.0)) * 100) AS NHSCommNeed3Percent
FROM CTE;

如果你想要一个集所有功能于一身的语句,这应该是可行的

SELECT 
SUM(CASE WHEN NHSCommunicationNeed1_Id IS NOT NULL THEN 1.0 ELSE 0.0 END) / COUNT(Id)  as NHSCommNeed1Percent, 
SUM(CASE WHEN NHSCommunicationNeed2_Id IS NOT NULL THEN 1.0 ELSE 0.0 END) / COUNT(Id)  as NHSCommNeed2Percent,
SUM(CASE WHEN NHSCommunicationNeed3_Id IS NOT NULL THEN 1.0 ELSE 0.0 END) / COUNT(Id)  as NHSCommNeed3Percent
FROM DDS.Referrals

如果你想要一个集所有功能于一身的语句,这应该是可行的

SELECT 
SUM(CASE WHEN NHSCommunicationNeed1_Id IS NOT NULL THEN 1.0 ELSE 0.0 END) / COUNT(Id)  as NHSCommNeed1Percent, 
SUM(CASE WHEN NHSCommunicationNeed2_Id IS NOT NULL THEN 1.0 ELSE 0.0 END) / COUNT(Id)  as NHSCommNeed2Percent,
SUM(CASE WHEN NHSCommunicationNeed3_Id IS NOT NULL THEN 1.0 ELSE 0.0 END) / COUNT(Id)  as NHSCommNeed3Percent
FROM DDS.Referrals

谢谢。有没有办法合并这两个语句,这样我就不必插入到#Totals中,只需查询DDS.refererals而不是插入它们,用另一个select将第一个查询包装起来,然后在那里进行聚合。@Bendonnell或者他们可以用
CASE
表达式中用
然后用1.0 ELSE 0 END
谢谢。是否有任何方法可以合并这两个语句,这样我就不必插入到#Totals中,只需查询DDS.refererals而不是插入它们,用另一个select将第一个查询包装起来,并在那里进行聚合。@Bendonnell或者他们可以用
CASE
表达式中用
然后用1.0 ELSE 0 END