2013-06-11 6 views
9

Ich versuche, zwei Zählungen zu erhalten und teile dann diese zwei Zählungen, um das Verhältnis der Punkte zu ermitteln, die ich zähle. Ich sah diesen Beitrag here und versuchte das. Ich erhalte einen Fehler in meinen Ergebnissen, keine Fehlermeldung nur falsche Nummer. Ich bin mit SQL-Server 2008Zwei Zählungen erhalten und sie dann teilen

Hier ist mein Code:

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

Die Zählungen erhalten produziert und korrekt angezeigt, aber für ein Verhältnis I bekommen 0 und bin mir nicht sicher, warum ich diese.

Vielen Dank,

Antwort

11

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

SQL Server berücksichtigen, dass A.NUM/A.DENOM int sind, weil A.NUM und A.DENUM int sind

+0

Dies erzeugte immer noch eine 0 ... Ich werde versuchen, die Tabellenerstellung anstatt INT zu FLOAT zu ändern. –

+1

Count gibt immer INT zurück, egal was du in der Tabelle machst, nichts ändert sich im Countdown(), ich habe diese Abfrage getestet und es funktioniert perfekt – VahiD

+1

lerne etwas neues jeden Tag, ich wusste nicht, dass COUNT() zurückgibt INT –

1

Das Verhältnis von zwei Ganzzahlen wird eine ganze Zahl sein. Zum Beispiel: 10/20 = 0,5 = 0. Sie müssen Ihr Verhältnis in einen Gleitkommabereich umwandeln, um eine genaue Antwort zu erhalten.

+0

Vielen Dank. Aber selbst dann bekomme ich immer noch eine 0 für mein Verhältnis. Soll ich sie von INT auf FLOAT ändern oder kümmert sich das CAST wirklich darum? –

+0

@MCP_infiltrator Sie müssen tatsächlich entweder die Zahl oder den Wert float, anstatt das Verhältnis als Ganzes. Siehe meine Antwort. – Chad

1

Es ist wegen Integer-Division abgeschnitten. Sie können eine reguläre Division durch Casting durchführen.

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

Geben Sie das jetzt los. –

+0

Das für mich, hat nicht funktioniert. Am Ende habe ich "CAST (A.NUM/A.DENOM) AS FLOAT" gespielt und "RATIO" in "@ TABLE1" in "FLOAT" geändert. –

+1

Ich habe die Tatsache übersehen, dass Ihre Tabellenspalte ein 'int' war. Dies hätte auch funktioniert, wenn die Zielspalte ein "float" gewesen wäre. – Chad

3

Die Struktur der Anfrage stört mich. Sie können es viel effizienter als:

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 

Dies hat keine Auswirkungen auf die Integer Division Problem, aber Ihre ursprüngliche Abfrage ist überkompliziert.

+0

Danke um das zu teilen, da es mich auch stört, weiß ich einfach nicht, wie ich es besser strukturieren soll, außerdem muss ich es skalieren, was bedeutet, dass ich viele weitere Numeratoren, Denominators und Ratios innerhalb derselben Abfrage bekommen muss. Soll ich das, was ich aufsetze, als meine endgültige Lösung veröffentlichen und fragen, wie es effizienter gestaltet werden kann? –

+0

Alos Ihre Abfrage spead up die Informationen von 2,5 Minuten bis zu 0,5 Minuten –

Verwandte Themen