1

我正在使用 sql server 2008,我正在尝试构建一个查询来显示来自单个 sql 表的一些整体结果。我想显示每个日期的计数(字段名),例如我想知道每个日期在表中重复名称“izla”的频率,但它也可能是“IZLA”或“Izla”,所以我必须找到一种将这些数据组合在一起并找到它们三个的计数的方法。

问题是,如果我尝试使用大写或小写,以便它们被自动视为相同,我会遇到问题:当 izla 转换为大写时,它变成了 İZLA,或者另一方面,当 IZLA 转换为小写时,它显示为 ızla。

最大的问题是如何将这些数据组合在一起?也许问题来自使用 nvarchar 但我需要列类型是这样的(不能改变它)。

4

3 回答 3

2

分组时,应使用不区分重音排序规则。您可以将其直接添加到您的 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 来使用最匹配的排序规则。

于 2009-08-05T13:41:43.477 回答
0

尝试在小写后用等效英文替换 ı 等

于 2009-08-05T13:29:37.317 回答
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 感兴趣。

于 2009-08-05T13:53:10.857 回答