为什么这个Sql语句不能正确地“排序”

为什么这个Sql语句不能正确地“排序”,sql,group-by,sql-order-by,Sql,Group By,Sql Order By,我有sql: SELECT t.TagText, COUNT(*) AS NumVidsWithTag FROM tbl_Tag t INNER JOIN tbl_Video_Tag_Xref x ON t.TagId=x.TagId INNER JOIN tbl_Video v ON x.VideoId=v.VideoId WHERE 6 IS NULL OR EXISTS (SELECT * FROM tbl_Video_Tag_Xref WHERE VideoId=6 AND TagId

我有sql:

SELECT t.TagText, COUNT(*) AS NumVidsWithTag 
FROM tbl_Tag t
INNER JOIN tbl_Video_Tag_Xref x ON t.TagId=x.TagId
INNER JOIN tbl_Video v ON x.VideoId=v.VideoId
WHERE 6 IS NULL OR EXISTS (SELECT * FROM tbl_Video_Tag_Xref WHERE VideoId=6 AND TagId=t.TagId) 
GROUP BY t.TagText 
返回:

1   1
10  1
11  1
12  1
13  1
14  1
15  1
16  1
17  1
18  1
19  1
2   1
20  1
然后我将sql更改为

SELECT t.TagText, COUNT(*) AS NumVidsWithTag 
FROM tbl_Tag t
INNER JOIN tbl_Video_Tag_Xref x ON t.TagId=x.TagId
INNER JOIN tbl_Video v ON x.VideoId=v.VideoId
WHERE 6 IS NULL OR EXISTS (SELECT * FROM tbl_Video_Tag_Xref WHERE VideoId=6 AND TagId=t.TagId) 
GROUP BY t.TagText 
ORDER BY t.TagText ASC
它仍然是:

1   1
10  1
11  1
12  1
13  1
14  1
15  1
16  1
17  1
18  1
19  1
2   1
20  1

我不明白为什么不能正确排序?

看起来TagText是一个varchar字段,而不是一个数字。SQL将根据文本排序规则对varchar字段进行排序-Aa位于B之前,因此19位于2之前。

这就是为什么列的数据类型不是整数。它是字符串,并像字符串一样排序

因此2在19之后


可能的解决方案是:将列的数据类型更改为整数

我假设t.TagText是一个字符字段?订单将使用此字段的ASCII值进行排序。上述排序顺序是正确的

假设tbl_Tag.TagText columns数据类型为varchar或类似类型

在这种情况下,这是正确排序-字母数字排序,19在2之前;11点之前会有100点

您需要将数据类型更改为数字类型

您可以在不更改表的架构的情况下执行此操作:

SELECT t.TagText, COUNT(*) AS NumVidsWithTag 
FROM tbl_Tag tINNER JOIN tbl_Video_Tag_Xref x ON t.TagId=x.TagId
    INNER JOIN tbl_Video v ON x.VideoId=v.VideoId
WHERE 6 IS NULL OR EXISTS (SELECT * FROM tbl_Video_Tag_Xref WHERE VideoId=6 AND TagId=t.TagId) 
GROUP BY t.TagText 
ORDER BY CONVERT(int, t.TagText) ASC

本质上,只要更改ORDER BY子句,将TagText列转换为int类型,就可以正确排序

TagText是一个字符串,因此11比2小

若要按数字排序,请将订单更改为

ORDER BY CONVERT(INT, t.TagText) ASC

我认为这是排序错误,因为order列是text varchar/nvarchar。尝试在sql语句的select部分转换为int

如果需要,在此处强制转换/转换帮助

TagText是一个字符字段nvarchar?正在按字母数字排序

您需要将其转换为数字格式以进行排序

SELECT t.TagText, COUNT(*) AS NumVidsWithTag 
FROM tbl_Tag t
INNER JOIN tbl_Video_Tag_Xref x ON t.TagId=x.TagId
INNER JOIN tbl_Video v ON x.VideoId=v.VideoIdWHERE 6 IS NULL OR EXISTS (SELECT * FROM tbl_Video_Tag_Xref 
WHERE VideoId=6 AND TagId=t.TagId) 
GROUP BY t.TagText ORDER BY CONVERT(INT, t.TagText) ASC

p、 s视频id只是一个替换的参数!为什么名称是TagText而不是TagNumber?: