2013-06-11 18 views
9

İki sayı almayı deniyorum ve sonra saydığım öğelerin oranını almak için bu iki sayımı bölüyorum. Bu yazıyı here gördüm ve denedim. Sonuçlarda bir hata alıyorum, hata mesajı sadece yanlış numara. Ben SQL Server 2008İki kez sayma ve sonra bölme

kullanıyorum İşte benim kodudur:

-- 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 

sayımları üretilen ve doğru şekilde gösteriliyordu fakat bir oran için ben 0 olsun ve bana böyle neden olarak emin değilim olsun.

iki tamsayılar

cevap

11

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

SQL Server A.NUM ve A.DENUM Sorgunuzun yapısı beni rahatsız

+0

Bu hala üretildi 0 ... INT FLOAT yerine tablo oluşturma işleminde denemek ve değiştirmek için gidiyorum. –

+1

Sayım her zaman INT değerini döndürür, bu yüzden tabloda yaptığınız hiçbir şey yok, Count türünde hiçbir şey değişmez(), bu sorguyu test ettim ve – VahiD

+1

her gün yeni bir şeyler öğrendim, COUNT() öğesinin INT –

1

oranı bir tamsayı olacak, teşekkür ederim. Örneğin: 10/20 = 0.5 = 0. Doğru bir cevap alabilmek için oranınızı bir kayan noktaya dökmeniz gerekir.

+0

Çok teşekkür ederim. Ancak o zaman bile Oranım için hala 0 aldım. Bunları INT'den FLOAT'a mı değiştirmeliyim yoksa CAST gerçekten bununla ilgilenmeli mi? –

+0

@MCP_infiltratör aslında bir bütün olarak oranı yerine, num ya da denom yüzmek için aslında gerek yok. Cevabımı gör. – Chad

1

Tamsayı bölümü nedeniyle kesiliyor. Döküm yaparak düzenli bölümleme yapabilirsiniz.

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

Bunu vermek bir şimdi git. –

+0

Bu benim için işe yaramadı. Ben CAST (AS/ORDENOM) AS FLOAT yaptık ve '@ TABLE1 'de' RATIO'' bir 'FLOAT' için de değiştirerek yaptı ve bu hile yaptı. –

+1

Tablo sütununuzun bir "int" olduğu gerçeğini kaçırdım. Hedef sütun bir “float” ise, bu da işe yarayacaktı. – Chad

3

int çünkü A.NUM/A.DENOM, int olduğunu düşünün. Sen çok daha verimli bir şekilde yapabilirsiniz:

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 

Bu tamsayı bölme sorunu etkilemez, ancak orijinal sorgu overcomplicated olduğunu.

+0

döndürdüğünü bilmiyordum bunu benimle aynı şekilde rahatsız ettiğinden, sadece nasıl daha iyi yapılandıracağımı bilmiyorum, aynı zamanda onu genişletmek zorundayım, yani aynı sorguda çok daha fazla Pay, Pay ve Ratio almam gerekiyor. Son çözümüm olarak çizdiğim şeyi yayınlamalı mıyım ve nasıl daha verimli hale getirilebileceğini sormalı mıyım? –

+0

Alos, sorgunuzu 2,5 dakikadan 0,5 dakikaya kadar almayı teşvik ediyor –