我正在使用sql server 2008,我正在尝试构建一个查询,用于显示单个sql表的一些整体结果。 我想显示每个日期的count(fieldname),例如我想知道每个日期在表中重复名称“izla”的频率,但它也可能是“IZLA”或“Izla”,所以我必须找到将这些数据组合为一个并找到其中三个数据的方法。
问题在于,如果我尝试使用大写或小写以便它们被自动地视为同样我有问题:当izla转换为上层时它变为İZLA或另一方面当IZLA转换为小写时它会被显示ızla。
最大的问题是如何将这些数据组合在一起?也许问题来自使用nvarchar,但我需要列类型(不能改变它)。
答案 0 :(得分:2)
分组时,应使用Accent Insensitive排序规则。您可以将此直接添加到group by子句中。以下是一个例子:
Declare @Temp Table(Data nvarchar(100))
Insert Into @Temp Values(N'izla')
Insert Into @Temp Values(N'İZLA')
Insert Into @Temp Values(N'IZLA')
Insert Into @Temp Values(N'Izla')
Select Data,
Count(*)
From @Temp
Group By Data
Select Data Collate Latin1_General_CI_AI,
Count(*)
From @Temp
Group By Data Collate Latin1_General_CI_AI
运行此示例时,您将看到第一个查询创建了两行(计数为3且计数为1)。第二个示例使用重音不敏感排序规则进行分组,因此所有4个项目都组合在一起。
我在我的示例中使用了 Latin1_General_CI_AI 。我建议您检查正在使用的列的排序规则,然后通过将结尾的AS更改为AI来使用最匹配的排序规则。
答案 1 :(得分:0)
在小写
之后尝试用英语等效替换ı等答案 2 :(得分:0)
这一切都归结为整理,这是系统对字符串数据进行排序的方式。
你可以这样说:
SELECT *, COUNT(*) OVER (PARTITION BY fieldname COLLATE Latin1_General_CI_AI), COUNT(*) OVER (PARTITION BY fieldname COLLATE Latin1_General_CI_AS)
FROM yourtable
这将为您提供一些很好的数字,每个名称出现在各种格式中的次数。有许多排序规则,您可以在联机丛书中搜索完整列表。例如,您可能也对Latin1_General_BIN感兴趣。
罗布