首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >server 2008中复杂的平均计算

server 2008中复杂的平均计算
EN

Stack Overflow用户
提问于 2016-03-22 09:21:29
回答 1查看 82关注 0票数 0

sql server 2008

我有一个表,在该表中,我将根据所有列计算value列中可用数据的百分比。

现在,我正在试图计算值列中可用数据的avg百分比。

但挑战是,在计算所有avg列的时,我需要排除这些类型的列,例如

如果牙科为NULL,而DENTAL_VALUE为NULL,则在计算平均值时不应考虑。

但是,如果牙科不是NULL,而DENTAL_VALUE是NULL,那么计算中将包括这些内容。

下面的脚本给出了每个列的avg,

请任何人帮助我如何计算的总体平均为上述情况。

在这种情况下,在计算总体平均值时,我必须排除牙科和dental_value,但不排除肾。

表格

代码语言:javascript
复制
DECLARE @PHARMA TABLE
(
MRN VARCHAR (30),
department VARCHAR (30),
optical VARCHAR (30),
optical_value VARCHAR (30), 
dermo VARCHAR (30),
dermo_value VARCHAR (30),
Neuro VARCHAR (30),
Neuro_value VARCHAR (30),
DENTAL VARCHAR (30),
DENTAL_VALUE VARCHAR (30)
   Nephro VARCHAR (30),
    Nephro_VALUE VARCHAR (30)
)

Insert @PHARMA

SELECT 'BSE23098', 'Clinic', 'Willmar','10', 'Betamethasone' ,'20', 'neurobion', NULL,NULL,NULL,'TYPE-A',NULL UNION ALL

SELECT 'ZSE23098', 'Clinic', 'AUROBRIME','10', 'adapalene' ,'20', 'Blong', NULL,NULL,NULL,'TYPE-B',NULL UNION ALL
SELECT 'ZSE23098', 'Clinic', 'VOZOLE', NULL, 'SURFRAZ', '30' ,'Evion', '63' ,NULL,NULL,'TYPE-C',NULL

查询:

代码语言:javascript
复制
SELECT 
    CAST(optical_not_NULL * 100.0 / NULLIF((optical_NULL + optical_not_NULL), 0) AS decimal(5, 2)) AS optical_fill_rate,
    CAST(dermo_not_NULL * 100.0 / NULLIF((dermo_NULL + dermo_not_NULL), 0) AS decimal(5, 2)) AS dermo_fill_rate,
    CAST(dental_not_NULL * 100.0 / NULLIF((dental_NULL + dental_not_NULL), 0) AS decimal(5, 2)) AS dental_fill_rate,
    CAST(neuro_not_NULL * 100.0 / NULLIF((neuro_NULL + neuro_not_NULL), 0) AS decimal(5, 2)) AS neuro_fill_rate
FROM (
    SELECT
        SUM(CASE WHEN optical_value IS NULL THEN 1 ELSE 0 END) AS optical_NULL,
        SUM(CASE WHEN optical_value IS NULL THEN 0 ELSE 1 END) AS optical_not_NULL,
        SUM(CASE WHEN dermo_value IS NULL THEN 1 ELSE 0 END) AS dermo_NULL,
        SUM(CASE WHEN dermo_value IS NULL THEN 0 ELSE 1 END) AS dermo_not_NULL,
        SUM(CASE WHEN neuro_value IS NULL THEN 1 ELSE 0 END) AS neuro_NULL,
        SUM(CASE WHEN neuro_value IS NULL THEN 0 ELSE 1 END) AS neuro_not_NULL,
        SUM(CASE WHEN dental_value IS NULL THEN 1 ELSE 0 END) AS dental_NULL,
        SUM(CASE WHEN dental_value IS NULL THEN 0 ELSE 1 END) AS dental_not_NULL

    FROM @PHARMA
) AS derived
EN

回答 1

Stack Overflow用户

发布于 2016-03-22 10:42:48

你可以简化成

代码语言:javascript
复制
SELECT  CAST (COUNT (CASE WHEN optical is not null 
                          THEN optical_value END)
              * 100.0 / COUNT(*) AS decimal(5,2) ) as optical_fill_rate
FROM    @PHARMA 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36150433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档