使用select(count)查询总计百分比

时间:2011-12-22 22:42:54

标签: sql select count

我正在计算第1天和第2天之间疼痛的变化。 有两个字段,Pain_Admit_Comfort和Pain_48_Hr_Comfort,每个字段中的选项是Yes / No。

我需要找到承认痛苦的每个人,并在2天后更舒服。

这是查询。前两个语句返回正确的数字。我无法弄清楚如何使用与分子和分母相同的陈述来划分。

 select 
     (select COUNT (PAIN_48_HR_COMFORT_C) 
      FROM CASES WHERE PAIN_48_HR_COMFORT_C='Yes') as Forty_Eight_Hours,

     (SELECT COUNT (PAIN_ADMIT_COMFORT_C)
      FROM CASES WHERE PAIN_ADMIT_COMFORT_C='YES') as Admit_Uncomfort_Yes,

     ((select COUNT (PAIN_48_HR_COMFORT_C) 
       FROM CASES WHERE PAIN_48_HR_COMFORT_C='Yes')
      /
     (SELECT COUNT (PAIN_ADMIT_COMFORT_C) 
      FROM CASES WHERE PAIN_ADMIT_COMFORT_C='YES')) AS Percent_Changed

 from CASES

谢谢

2 个答案:

答案 0 :(得分:3)

我没有发现你的陈述有任何直接问题,但是以下陈述应该返回正确的结果,并且可能更容易阅读。

SELECT  feh.Forty_Eight_Hours
        , auy.Admit_Uncomfort_Yes
        , Percent_Changed = CAST(feh.Forty_Eight_Hours AS FLOAT) / auy.Admit_Uncomfort_Yes
FROM    (
          SELECT  Forty_Eight_Hours = COUNT(PAIN_48_HR_COMFORT_C)
          FROM    CASES
          WHERE   PAIN_48_HR_COMFORT_C = 'Yes' 
        ) feh
        CROSS APPLY (
          SELECT   Admit_Uncomfort_Yes = COUNT (PAIN_ADMIT_COMFORT_C) 
          FROM     CASES 
          WHERE    PAIN_ADMIT_COMFORT_C = 'Yes'
        ) auy

答案 1 :(得分:0)

您的查询和其他答案效率非常低(多次选择)。

您想要的是一个“枢轴”,并且使用一个选择表格(您的查询使用4)的最有效的编码方式如下:

 select
 sum(case when PAIN_48_HR_COMFORT_C = 'Yes' then 1 else 0 end) as Forty_Eight_Hours,
 sum(case when PAIN_ADMIT_COMFORT_C = 'Yes' then 1 else 0 end) as Admit_Uncomfort_Yes
 sum(case when PAIN_ADMIT_COMFORT_C = 'Yes' AND PAIN_48_HR_COMFORT_C = 'NO' then 1 else 0 end) as Improved_pain
 FROM CASES

我不确定列是什么意思 - 你可能需要将'YES'更改为'NO'等以使“has”/“has not”痛苦正确。