首页 > 解决方案 > 在 SQL 中取 dummy 的平均值

问题描述

我试图找出两列不相同的行的分数:

此代码给出 1 或 0(取决于我如何定义虚拟对象):

SELECT CAST(AVG(subq.ens) AS DECIMAL(10,7))
from (select INDDATO_DATO, INDTIDSPUNKT_DRGKONTAKT_DATO, LeveranceDato_DATO, 
    case 
    when INDDATO_DATO = INDTIDSPUNKT_DRGKONTAKT_DATO THEN 1
    else 0
    end as ens
    FROM [Patient_kval].[DRG2018].[V_DRG2018_DRGKONTAKTER]
    where LeveranceDato_DATO= '2019-03-27'
    ) subq

但是我通过数两次除法解决了这个问题,结果是35%。即我已经这样做了:

SELECT count(*)
FROM [Patient_kval].[DRG2018].[V_DRG2018_DRGKONTAKTER]
where LeveranceDato_DATO= '2019-03-27' and INDDATO_DATO = INDTIDSPUNKT_DRGKONTAKT_DATO; -- 1.954.352


SELECT count(*)
FROM [Patient_kval].[DRG2018].[V_DRG2018_DRGKONTAKTER]
where LeveranceDato_DATO= '2019-03-27';-- 5.441.763

但我想知道第一种方法有什么问题。

标签: sqlsql-serverssms

解决方案


You are taking an avg of integers and the result is casted to integer, see https://docs.microsoft.com/en-us/sql/t-sql/functions/avg-transact-sql?view=sql-server-2017 . Use decimal constants instead.

SELECT CAST(AVG(subq.ens) AS DECIMAL(10,7))
from (select INDDATO_DATO, INDTIDSPUNKT_DRGKONTAKT_DATO, LeveranceDato_DATO, 
    case 
    when INDDATO_DATO = INDTIDSPUNKT_DRGKONTAKT_DATO THEN 1.0
    else 0.0
    end as ens
    FROM [Patient_kval].[DRG2018].[V_DRG2018_DRGKONTAKTER]
    where LeveranceDato_DATO= '2019-03-27'
    ) subq

推荐阅读