我在ms sql server中运行一些基本的东西时遇到了麻烦。我尝试了几种方法,一些在论坛上找到,但总是给我错误。
想象一下,我有一张桌子上有几个人的医院数据。我对两列特别感兴趣:一列对应于该人居住的城镇的代码(类型编号),另一列对应于该人住院时的年龄组(文本类型)。例如:
.. city_code | group_age...
______________________________
111 | 65 - 69
1195 | + 95
203 | 70 - 74
1176 | 85 - 89
203 | 70 - 74
我想要的是创建一个新表格,告诉我每个城市和每个年龄组中有多少人存在于数据库中:
...city_code | 65 - 69 | 70_74 | 75 - 79 | 80 - 84 | 85 - 89 | 90 - 94 | +95
111 | 1 | 0 | 0 | 0 | 0 | 0 | 0
203 | 0 | 2 | 0 | 0 | 0 | 0 | 0
1176 | 0 | 0 | 0 | 0 | 1 | 0 | 0
1195 | 0 | 0 | 0 | 0 | 0 | 0 | 1
当结果为零时,我可以创建此表EXCEPT。它没有假设任何值,这意味着我必须逐个检查零,这是不可能的,因为我正在使用的数据量。
在我尝试的方式中,我看到的越多:
select city_code, sum(case when age_group = '65-69' then 1 else 0 end) as '65-69',
sum(case when age_group= '+95' then 1 else 0 end) as '+95'
from table1;
这给我一个语法错误。我需要帮助知道如何通过ms sql server中的咨询结构以最快的方式完成它。
谢谢,我希望你理解我的问题!
答案 0 :(得分:0)
您需要在末尾添加group by子句,以便按每个city_code对总和进行分组:
from table1
group by city_code
您可能还需要将别名列名放在括号中,而不是单引号。所以
as [65-69]
而不是
as '65-69'
答案 1 :(得分:0)
这适用于示例中的静态列名称:
SELECT
city_code,
[65 - 69] = SUM(CASE group_age WHEN '65 - 69' THEN 1 ELSE 0 END),
[70 - 74] = SUM(CASE group_age WHEN '70 - 74' THEN 1 ELSE 0 END),
[75 - 79] = SUM(CASE group_age WHEN '75 - 79' THEN 1 ELSE 0 END),
[80 - 84] = SUM(CASE group_age WHEN '80 - 84' THEN 1 ELSE 0 END),
[85 - 89] = SUM(CASE group_age WHEN '85 - 89' THEN 1 ELSE 0 END),
[90 - 94] = SUM(CASE group_age WHEN '90 - 94' THEN 1 ELSE 0 END),
[+ 95] = SUM(CASE group_Age WHEN '+ 95' THEN 1 ELSE 0 END)
FROM table1
GROUP BY city_code
对于一种更加动态的方法,可以在添加年龄组时选择年龄组:
DECLARE @Columns NVARCHAR(MAX),
@Query NVARCHAR(MAX);
SET @Columns = STUFF((SELECT DISTINCT ',' + QUOTENAME(group_age)
FROM table1
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),
1, 1, '');
SET @Query = 'SELECT city_code, ' + @Columns + ' ' +
'FROM (SELECT city_code, group_age ' +
'FROM table1) t '+
'PIVOT ' +
'(COUNT(group_age) FOR group_age IN (' + @Columns + ')) p';
EXECUTE(@Query);
答案 2 :(得分:0)
好的,首先我要谈的是microsoft access sql server。我应该写完所有而不仅仅是缩写。对于那个很抱歉。
在图片中,您可以看到我的数据库的一部分。我说的列是“grupo_etário”(group_age)和“cod_mun”(city_code)。
Beargle,我尝试了你的第二个建议并给出了一个新的错误:无效的SQL语句;预期'删除','插入','过程','选择'或'更新'。
关于空格,我也考虑过这个问题,但我已经阅读了对熊的解释,因此我认为这不是问题。