2013-06-11 6 views
9

두 카운트를 얻고이 두 카운트를 나누어서 제가 계산할 항목의 비율을 얻으려고합니다. 나는이 게시물 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 

카운트 생산하고 올바르게 표시되지만 비율에 대한 I는 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

두 정수의 비율은 정수입니다. 예 : 10/20 = 0.5 = 0. 정확한 답을 얻으려면 비율을 부동으로 변환해야합니다.

+0

대단히 감사합니다. 하지만 그럼에도 불구하고 나는 여전히 내 비율에 대해 0을 얻습니다. INT에서 FLOAT로 변경해야합니까? 아니면 CAST가 실제로 처리해야합니까? –

+0

@MCP_infiltrator 실제로 비율이 아닌 float으로 num 또는 denom 중 하나를 형변환해야합니다. 내 대답을 보라. – 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 

이 정수 분할 문제에 영향을 미치지 않지만, 원래 쿼리 overcomplicated입니다.

+0

감사합니다. 이 문제를 나에게도 알려주고 있기 때문에 이것을 공유하기 때문에 더 잘 구조화하는 방법을 알지 못한다. 또한 그것을 스케일 아웃해야한다. 즉, 동일한 쿼리 내에서 더 많은 Numerators, Denominators 및 Ratio를 가져와야 함을 의미한다. 최종 솔루션으로 작성한 내용을 게시하고 효율성을 높이는 방법을 묻는 것이 좋을까요? –

+0

쿼리를 실행하여 2.5 분에서 0.5 분으로 정보를 얻으십시오. –

관련 문제