Sql 使用select(count)查询以获取总数的百分比

Sql 使用select(count)查询以获取总数的百分比,sql,select,count,Sql,Select,Count,我在计算第一天和第二天之间疼痛的变化。 有两个字段,疼痛\承认\舒适和疼痛\ 48 \ Hr \舒适,每个字段中的选项为是/否 我需要找到每一个在手术中感到疼痛的人,并且在两天后感觉更舒服 这就是问题所在。前两条语句返回正确的数字。我不知道如何使用分子和分母的相同语句进行除法 select (select COUNT (PAIN_48_HR_COMFORT_C) FROM CASES WHERE PAIN_48_HR_COMFORT_C='Yes') as Forty

我在计算第一天和第二天之间疼痛的变化。 有两个字段,疼痛\承认\舒适和疼痛\ 48 \ Hr \舒适,每个字段中的选项为是/否

我需要找到每一个在手术中感到疼痛的人,并且在两天后感觉更舒服

这就是问题所在。前两条语句返回正确的数字。我不知道如何使用分子和分母的相同语句进行除法

 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

谢谢

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

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

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

您需要的称为“pivot”,使用表上的一个select(您的查询使用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

我不知道这些列的意思是什么-你可能需要将“是”改为“否”等,以纠正“has”/“has not”的错误。

@MartinSmith-谢谢,我正在考虑这个问题。错误已修复。谢谢。我不熟悉交叉应用,我感谢您的洞察力和指导。竖起两个大拇指。@Stan-没问题,但我假定您正在使用SQL Server。如果没有,您可能希望将交叉应用更改为内部连接,而不实际连接om。在这里,多个
选择不一定效率低下。
,其中
谓词位于不同的列上。取决于表中的索引。@Bohemian-您需要以某种方式将“四十小时八小时”值除以“允许”值。我看不出我提出的查询在这方面有多低效?在我看来,最好的情况是,当这是一个完整的表扫描时,必须扫描两个索引(并且缺少百分比)。@Lieven索引不用于具有如此少不同值的列(这里2:是和否),因此不管怎样,您都在看完整的表扫描。我的查询只通过一次。你的有两个。就这么简单。如果要重新划分,请将此查询包装在select中以获得划分-重要的是,您拥有计算所需统计数据所需的原始值。请注意,您的查询和OPs实际上并没有衡量他想要什么。如果你想得够久,你就会明白为什么。@Bohemian-SQL Server会很高兴地对2个值使用索引来进行
计数。它不必做任何书签查找回到基表。@Bohemian-如果你参考OP的声明,我需要找到每个在2天后感到疼痛和舒适的人,我想你是对的。