2013-06-11 40 views
9

我試圖得到兩個計數,然後將這兩個計數分開以獲得我計算的項目的比率。我看到這個帖子here並嘗試過。我在結果中收到錯誤,沒有錯誤消息,但數字不正確。我使用的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,我不知道,爲什麼我得到這個。

謝謝,

回答

11

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

SQL服務器認爲A.NUM/A.DENOM是整型,因爲A.NUM和A.DENUM是INT

+0

這仍然產生了0 ...我將嘗試更改表創建而不是INT到FLOAT。 –

+1

Count總是返回INT,所以無論你在表中做什麼,Count()的返回類型都沒有變化,我測試了這個查詢,它的工作完美 – VahiD

+1

每天學習新東西,我不知道COUNT()返回INT –

1

兩個整數的比例將是一個整數。例如:10/20 = 0.5 = 0.您需要將您的比例轉換爲浮點數才能獲得準確的答案。

+0

非常感謝。但即使如此,我的比率仍然爲0。我是否應該將它們從INT更改爲FLOAT,還是CAST真的需要處理這些問題? –

+0

@MCP_infiltrator實際上需要將num或denom轉換爲float,而不是整個比例。看到我的答案。 – Chad

1

由於整數除法而截斷。您可以通過投射進行常規分割。

INSERT INTO @TABLE1 
SELECT 
A.NUM, A.DENOM, CAST(A.NUM AS FLOAT)/A.DENOM 
+0

現在就放手吧。 –

+0

這對我來說,沒有工作。我最終做了'CAST(A.NUM/A.DENOM)作爲FLOAT',並將'@ TABLE1'中的'RATIO'改爲'FLOAT',並且這樣做。 –

+1

我錯過了你的表列是int的事實。如果目標列是「浮動」,這也會有效。 – Chad

3

您的查詢的結構困擾我。您可以更有效地做到這一點是:

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 

這並不影響該整數除法問題,但你的原始查詢是過於複雜。

+0

謝謝因爲它也困擾着我,所以我只是不知道如何更好地構建它,也不得不擴展它,這意味着我必須在同一個查詢中獲得更多的Numerators,Denominators和Ratios。我是否應該發佈我作爲最終解決方案制定的內容,並要求瞭解如何提高效率? –

+0

確保您的查詢能夠將信息從2.5分鐘縮短到0.5分鐘 –

相關問題