Sql server 如何计数归零?ms sql
我在ms sql server中运行一些基本功能时遇到问题。我尝试过几种方法,有些是在论坛上找到的,但总是给我错误 想象一下,我有一张表格,上面有几个人的医院数据。我对两列特别感兴趣:一列对应于此人居住的城镇的代码(类型编号),另一列对应于此人住院时的年龄组(输入文本)。例如: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
.. 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,这只是一个示例。我没有注意到抱歉,你可以在我写的另一篇评论中看到真实的数据库,或者至少是其中的一部分。