14

我试图获得两个计数,然后将这两个计数相除以获得我正在计数的项目的比率。我在这里看到了这篇文章并尝试了。我的结果出现错误,没有错误消息,只是数字不正确。我正在使用 SQL-Server 2008

这是我的代码:

-- INTERNAL PEPPER REPORT
--#####################################################################

-- VARIABLE DECLARATION AND INITIALIZATION
DECLARE @SD DATETIME
DECLARE @ED DATETIME

SET @SD = '2013-01-01'
SET @ED = '2013-03-31'

-- TABLE DECLARATION ##################################################
DECLARE @TABLE1 TABLE(NUMERATOR INT, DENOMINATOR INT, RATIO INT)
--#####################################################################

-- WHAT GETS INSERTED INTO TABLE 1
INSERT INTO @TABLE1
SELECT
A.NUM, A.DENOM, A.NUM/A.DENOM 

FROM
(
-- COLUMN SELECTION. TWO NUMBERS WILL REPRESENT A NUM AND A DENOM
SELECT 
    (SELECT COUNT(DRG_NO)
        FROM smsdss.BMH_PLM_PtAcct_V
        WHERE drg_no IN (061,062,063,064,065,066)
        AND Adm_Date BETWEEN @SD AND @ED
        AND PLM_PT_ACCT_TYPE = 'I')
        AS NUM,
    (SELECT COUNT(DRG_NO)
        FROM smsdss.BMH_PLM_PtAcct_V
        WHERE drg_no IN (061,062,063,064,065,066,067,068,069)
        AND Adm_Date BETWEEN @SD AND @ED
        AND Plm_Pt_Acct_Type = 'I')
        AS DENOM
)A

SELECT NUMERATOR, DENOMINATOR, RATIO
FROM @TABLE1

计数得到正确生成和显示,但是对于比率我得到 0 并且不确定我为什么得到这个。

谢谢你,

4

5 回答 5

21

利用SELECT A.NUM, A.DENOM, cast(A.NUM as float)/cast(A.DENOM as float)

SQL Server 认为 A.NUM / A.DENOM 是 int,因为 A.NUM 和 A.DENUM 是 int

于 2013-06-11T18:33:22.053 回答
4

你的查询结构让我很困扰。您可以更有效地做到这一点:

SELECT A.NUMer, A.DENOM, cast(A.NUMer as float)/A.DENOM 
FROM (SELECT COUNT(case when drg_no IN (061,062,063,064,065,066) then DRG_NO
                   end ) as Numer,
             count(case when drg_no IN 061,062,063,064,065,066,067,068,069) then DRG_NO
                   end) as denom
      FROM smsdss.BMH_PLM_PtAcct_V
      WHERE drg_no IN (061,062,063,064,065,066)
        AND Adm_Date BETWEEN @SD AND @ED
        AND PLM_PT_ACCT_TYPE = 'I'
     ) a

这不会影响整数除法问题,但您的原始查询过于复杂。

于 2013-06-11T19:16:02.877 回答
4

改用下面的查询

SELECT
A.NUM, A.DENOM, cast(A.NUM as float)/cast(A.DENOM as float)

FROM
(
-- COLUMN SELECTION. TWO NUMBERS WILL REPRESENT A NUM AND A DENOM
SELECT 
    (SELECT COUNT(DRG_NO)
        FROM smsdss.BMH_PLM_PtAcct_V
        WHERE drg_no IN (061,062,063,064,065,066)
        AND Adm_Date BETWEEN @SD AND @ED
        AND PLM_PT_ACCT_TYPE = 'I')
        AS NUM,
    (SELECT COUNT(DRG_NO)
        FROM smsdss.BMH_PLM_PtAcct_V
        WHERE drg_no IN (061,062,063,064,065,066,067,068,069)
        AND Adm_Date BETWEEN @SD AND @ED
        AND Plm_Pt_Acct_Type = 'I')
        AS DENOM
)A

问题是如果 num 和 denom 都是 INT,则除法也将返回 INT,因此将它们中的一个(或两者)转换为浮点数将导致浮点数作为除法结果

于 2018-10-21T14:14:01.457 回答
1

It's truncating due to integer division. You can perform regular division by casting.

INSERT INTO @TABLE1
SELECT
A.NUM, A.DENOM, CAST(A.NUM AS FLOAT)/A.DENOM 
于 2013-06-11T18:31:14.637 回答
1

两个整数之比将是一个整数。例如:10/20 = 0.5 = 0。您需要将比率转换为浮点数才能获得准确的答案。

于 2013-06-11T18:30:47.050 回答