Sql server 获取数字的百分比
我认为这是一个令人毛骨悚然的取整问题,但我不知道内部sql是如何工作的。也许有人能帮上忙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
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