Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 server 如何计数归零?ms sql_Sql Server_Ms Access 2010 - Fatal编程技术网

Sql server 如何计数归零?ms sql

Sql server 如何计数归零?ms sql,sql-server,ms-access-2010,Sql Server,Ms Access 2010,我在ms sql server中运行一些基本功能时遇到问题。我尝试过几种方法,有些是在论坛上找到的,但总是给我错误 想象一下,我有一张表格,上面有几个人的医院数据。我对两列特别感兴趣:一列对应于此人居住的城镇的代码(类型编号),另一列对应于此人住院时的年龄组(输入文本)。例如: .. city_code | group_age... ______________________________ 111 | 65 - 69 1195 | + 95

我在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
我可以创建这个表,除非结果为零。它没有假设任何值,这意味着我必须逐个检查为零的值,考虑到我正在处理的数据量,这是不可能的

在我尝试的方法中,我看到的更多是:

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中的咨询结构以尽可能快的方式完成此任务


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

您需要在末尾添加group by子句,以便按照每个城市代码对总和进行分组:

from table1
group by city_code
您可能还需要将别名列名称放在括号中,而不是单引号中。所以

as [65-69] 
而不是

as '65-69'

这将适用于示例中的静态列名:

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

好的,首先我要说的是MicrosoftAccessSQLServer。我应该把它全部写下来,而不仅仅是首字母。很抱歉

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

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


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

是的,我已经这样做了,但它给了我同样的错误。你能发布你得到的错误,而不是仅仅说它是语法错误吗?查询表达式“sum”中的语法错误(缺少运算符)(case when age_group='65-69'然后1 else 0 end)作为'65-69',sum(case when age_group='95'然后1 else 0 end)'尝试将表名放在方括号中(例如[65-69])检查我最近的编辑,我之前提到了放括号的错误列。谢谢,但我只是尝试了一下,仍然像往常一样给出了相同的错误:语法错误(查询表达式'[65-69]=SUM中缺少运算符)(当'65-69'时为grupo_etário,则1 ELSE 0结束)“在转换过程中有些东西丢失了。请提供确切的表结构和正在使用的查询。请尝试删除名称中的空格,例如“65-69”而不是“65-69”。Access无法很好地处理列名中的空格。@Andrew对Access中包含空格的列没有问题(数据库设计除外)只要是。问题提到SQL Server,不确定为什么要标记Access。请检查我的新答案。您可以在那里看到我的部分数据库!看起来您的主要问题是当您的表的字段名为group_age时,您在查询中使用字段名age_group。为什么要使用MS Access标记?David,这只是一个示例。我没有注意到抱歉,你可以在我写的另一篇评论中看到真实的数据库,或者至少是其中的一部分。