怎么算回归零? ms sql

时间:2014-07-30 16:02:49

标签: sql-server ms-access-2010

我在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中的咨询结构以最快的方式完成它。

谢谢,我希望你理解我的问题!

3 个答案:

答案 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

SQLFiddle

对于一种更加动态的方法,可以在添加年龄组时选择年龄组:

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);

SQLFiddle

答案 2 :(得分:0)

enter image description here 好的,首先我要谈的是microsoft access sql server。我应该写完所有而不仅仅是缩写。对于那个很抱歉。

在图片中,您可以看到我的数据库的一部分。我说的列是“grupo_etário”(group_age)和“cod_mun”(city_code)。

Beargle,我尝试了你的第二个建议并给出了一个新的错误:无效的SQL语句;预期'删除','插入','过程','选择'或'更新'。

关于空格,我也考虑过这个问题,但我已经阅读了对熊的解释,因此我认为这不是问题。