2013-06-11 8 views
9

私は2つのカウントを取得しようとしていると私はカウントしている項目の比率を得るために、これらの2つのカウントを分割します。私はこのポストhereを見て、それを試みた。私の結果にエラーが表示されていますが、間違った番号のエラーメッセージはありません。私はここではSQL-Server 2008の2つのカウントを取得し、それらを分割する

を使用しています私のコードです:

-- 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 ServerのA.NUMとA.DENUMは、クエリの構造が私を悩ます

+0

これはまだ0を生成しました...私は、INTの代わりに表の作成をFLOATに変更しようとしています。 –

+1

Countは常にINTを返すので、Count()の戻り値の型は何も変わりません。このクエリをテストしたところ、完璧に機能しました – VahiD

+1

毎日新しいことを学ぶ、COUNT()がINTを返します。 –

1

2つの整数の比は整数になります。例: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)AS FLOAT'を行い、' @ TABLE1'の 'RATIO'を' FLOAT'に変更しました。それがそのトリックでした。 –

+1

あなたのテーブルの列が 'int'だったという事実を忘れました。宛先の列が 'float'の場合も同様です。 – Chad

3

int型であるため、A.NUM/A.DENOMは、int型であることを考えます。

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分に情報を得る –

関連する問題