我有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
我很困惑为什么这不合适?
答案 0 :(得分:4)
排序正确。
TagText是一个字符串,因此“11”小于'“2”,例如
要以数字方式对其进行排序,请将您的ORDER BY更改为
ORDER BY CONVERT(INT, t.TagText) ASC
答案 1 :(得分:2)
看起来TagText是一个varchar字段,而不是一个数字。 SQL将根据文本排序规则对varchar字段进行排序 - Aa出现在B之前,因此19出现在2之前。
答案 2 :(得分:2)
假设tbl_Tag.TagText
列数据类型为varchar
或类似内容。
在这种情况下,这是正确排序 - 按字母顺序排序,19在2之前排序;并且100将在11之前出现。
您需要将数据类型更改为数字类型。
您可以在不更改表格架构的情况下执行此操作:
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
类型
答案 3 :(得分:2)
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
答案 4 :(得分:1)
这就是为什么因为列的数据类型不是integer
。它是字符串并按字符串排序。
因此2
来自19
可能的解决方案是:将列的数据类型更改为integer
答案 5 :(得分:1)
我假设t.TagText是一个字符字段?订单将使用此字段的ASCII值进行排序。上面的排序顺序是正确的。
答案 6 :(得分:1)
我认为它的排序错误,因为order列是一个文本(varchar / nvarchar)。尝试转换为sql的select部分中的int。
如果需要,转换/转换帮助 http://msdn.microsoft.com/en-us/library/ms187928.aspx