Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL按年龄范围和性别对患者进行分组_Sql_Count_Group By_Case - Fatal编程技术网

SQL按年龄范围和性别对患者进行分组

SQL按年龄范围和性别对患者进行分组,sql,count,group-by,case,Sql,Count,Group By,Case,表中显示了患者的出生日期和性别 我无法创建新表 大家好,我的问题是试图按性别和年龄范围列出患者。我现在有这个 SELECT CASE WHEN patient.birthdate > '01-jan-1988' THEN '1-25' WHEN patient.birthdate > '01-jan-1963' THEN '25-50' WHEN patient.birthdate > '01-jan-1938' THEN '50-75'

表中显示了患者的出生日期和性别 我无法创建新表

大家好,我的问题是试图按性别和年龄范围列出患者。我现在有这个

SELECT CASE
     WHEN patient.birthdate  > '01-jan-1988'  THEN '1-25' 
     WHEN patient.birthdate > '01-jan-1963' THEN '25-50'
     WHEN patient.birthdate > '01-jan-1938' THEN '50-75' 
     ELSE '75+' 
   END AS Age_Range, 
   COUNT(patient.sex) AS "M",
   (SELECT COUNT(patient.sex) FROM patient WHERE patient.sex = 'F' ) AS "F" 
FROM patient
WHERE patient.sex = 'M'
GROUP BY CASE 
       WHEN patient.birthdate > '01-jan-1988'  THEN '1-25' 
       WHEN patient.birthdate > '01-jan-1963' THEN '25-50'
       WHEN patient.birthdate > '01-jan-1938' THEN '50-75'
       ELSE '75+' 
     END
     ORDER BY Age_Range;
这是我的输出,正确地对男性进行分组和计数,但对于女性,我得到了每个年龄段相同的数字(3538),即女性患者的总数

SELECT CASE
  WHEN patient.birthdate  > '01-jan-1988'  THEN '1-25' 
  WHEN patient.birthdate > '01-jan-1963' THEN '25-50'
  WHEN patient.birthdate > '01-jan-1938' THEN '50-75' 
  ELSE '75+' 
END AS Age_Range, 
SUM(CASE WHEN patient.Sex = 'M' THEN 1 ELSE 0 END) AS Males,
SUM(CASE WHEN patient.Sex = 'F' THEN 1 ELSE 0 END) AS Females
FROM patient
GROUP BY CASE
  WHEN patient.birthdate  > '01-jan-1988'  THEN '1-25' 
  WHEN patient.birthdate > '01-jan-1963' THEN '25-50'
  WHEN patient.birthdate > '01-jan-1938' THEN '50-75' 
  ELSE '75+' 
END
我还建议这样做(如果您的系统支持CTE),我认为它更清晰(并且可能更快)

使用
CASE

SELECT CASE
     WHEN patient.birthdate  > '01-jan-1988'  THEN '1-25' 
     WHEN patient.birthdate > '01-jan-1963' THEN '25-50'
     WHEN patient.birthdate > '01-jan-1938' THEN '50-75' 
     ELSE '75+' 
     SUM(CASE WHEN patient.Sex = 'M' THEN 1 ELSE 0) AS M,
     SUM(CASE WHEN patient.Sex = 'F' THEN 1 ELSE 0) AS F
   END AS Age_Range, 
FROM patient
WHERE patient.sex = 'M'
GROUP BY CASE 
       WHEN patient.birthdate > '01-jan-1988'  THEN '1-25' 
       WHEN patient.birthdate > '01-jan-1963' THEN '25-50'
       WHEN patient.birthdate > '01-jan-1938' THEN '50-75'
       ELSE '75+' 
     END
     ORDER BY Age_Range;

你认为你的案例陈述中需要一个END关键字。否则看起来不错。@ZdravkoDanev您在
SUM(CASE..)
中缺少了
END
,谢谢,我添加了END,效果很好!第一次在stackoverflow上,比我想象的要好。
WITH NewAge AS
(
  SELECT CASE
       WHEN patient.birthdate > '01-jan-1988' THEN '1-25' 
       WHEN patient.birthdate > '01-jan-1963' THEN '25-50'
       WHEN patient.birthdate > '01-jan-1938' THEN '50-75' 
       ELSE '75+' 
     END AS Age_Range, 
     CASE WHEN patient.sex = 'M' THEN 1 ELSE NULL END AS "M",  
     CASE WHEN patient.sex = 'F' THEN 1 ELSE NULL END AS "F"  
  FROM patient
)
SELECT Age_Range, COUNT(M) AS "M Count", COUNT(F) AS "F Count"
FROM NewAge
GROUP Age_Range
ORDER BY Age_Range;
SELECT CASE
     WHEN patient.birthdate  > '01-jan-1988'  THEN '1-25' 
     WHEN patient.birthdate > '01-jan-1963' THEN '25-50'
     WHEN patient.birthdate > '01-jan-1938' THEN '50-75' 
     ELSE '75+' 
     SUM(CASE WHEN patient.Sex = 'M' THEN 1 ELSE 0) AS M,
     SUM(CASE WHEN patient.Sex = 'F' THEN 1 ELSE 0) AS F
   END AS Age_Range, 
FROM patient
WHERE patient.sex = 'M'
GROUP BY CASE 
       WHEN patient.birthdate > '01-jan-1988'  THEN '1-25' 
       WHEN patient.birthdate > '01-jan-1963' THEN '25-50'
       WHEN patient.birthdate > '01-jan-1938' THEN '50-75'
       ELSE '75+' 
     END
     ORDER BY Age_Range;
SELECT CASE
     WHEN patient.birthdate  > '01-jan-1988'  THEN '1-25' 
     WHEN patient.birthdate > '01-jan-1963' THEN '25-50'
     WHEN patient.birthdate > '01-jan-1938' THEN '50-75' 
     ELSE '75+' 
   END AS Age_Range, 
   COUNT(CASE WHEN patient.sex = 'M' THEN patient.sex END) AS "M Count",  
   COUNT(CASE WHEN patient.sex = 'F' THEN patient.sex END) AS "F Count"
FROM patient
GROUP BY CASE 
       WHEN patient.birthdate > '01-jan-1988'  THEN '1-25' 
       WHEN patient.birthdate > '01-jan-1963' THEN '25-50'
       WHEN patient.birthdate > '01-jan-1938' THEN '50-75'
       ELSE '75+' 
     END
     ORDER BY Age_Range;