Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 如何根据局部字段分组?_Tsql_Group By - Fatal编程技术网

Tsql 如何根据局部字段分组?

Tsql 如何根据局部字段分组?,tsql,group-by,Tsql,Group By,您好,我的数据库中有一个表,其中包含一些浏览器信息。我目前正在使用以下T-SQL获取摘要列表: SELECT Browser, Version, SUM(Count) as Count FROM AnalyticsBrowsers WHERE Month=8 AND Year=2011 AND UserAgent NOT LIKE '%YandexBot%' AND UserAgent NOT LIKE '%Googlebot%' AND UserAgent NOT LIKE '%Yahoo!

您好,我的数据库中有一个表,其中包含一些浏览器信息。我目前正在使用以下T-SQL获取摘要列表:

SELECT Browser, Version, SUM(Count) as Count FROM AnalyticsBrowsers
WHERE Month=8 AND Year=2011
AND UserAgent NOT LIKE '%YandexBot%'
AND UserAgent NOT LIKE '%Googlebot%'
AND UserAgent NOT LIKE '%Yahoo! Slurp%'
AND UserAgent NOT LIKE '%Exabot%'
AND UserAgent NOT LIKE '%Ezooms%'
AND UserAgent NOT LIKE '%facebookexternalhit%'
AND UserAgent NOT LIKE '%YPBot%'
AND UserAgent NOT LIKE '%Nutraspace%'
AND UserAgent NOT LIKE '%AhrefsBot%'
AND UserAgent NOT LIKE '%Gigabot%'
AND UserAgent NOT LIKE '%GT::WWW%'
AND UserAgent NOT LIKE '%WGet%'
AND UserAgent NOT LIKE '%cmsworldmap%'
AND UserAgent NOT LIKE '%CatchBot%'
AND UserAgent NOT LIKE '%SuperPages%'
AND UserAgent NOT LIKE '%msnbot%'
AND UserAgent NOT LIKE '%nutch%'
AND UserAgent NOT LIKE '%Yeti%'
AND UserAgent NOT LIKE '%Curl%'
AND UserAgent NOT LIKE '%Mediapartners-Google%'
AND UserAgent NOT LIKE '%Python-urllib%'
AND UserAgent NOT LIKE '%AC-BaiduBot%'
AND UserAgent NOT LIKE '%MLBot%'
AND UserAgent NOT LIKE '%YahooCacheSystem%'
AND UserAgent NOT LIKE '%Xenu%'
AND UserAgent NOT LIKE '%DoCoMo%'
AND UserAgent NOT LIKE 'Content Crawler'
GROUP BY Browser, Version
ORDER BY Count DESC
虽然不太漂亮,但到目前为止它仍在发挥作用。我得到的结果如下所示:

Browser            Version      Count
Mozilla            5.0          804
IE                 8.0          738
AppleMAC-Safari    5.0          429
IE                 7.0          371
IE                 6.0          271
Firefox            6.0          189
IE                 9.0          137
Firefox            5.0          68
Firefox            3.6.20       42
Firefox            3.6.10       33
Firefox            4.0.1        20
Unknown            0.0          17
Firefox            3.6.18       10
Firefox            5.0.1        9
Mozilla            1.9.2.20     8
Firefox            3.6.13       6
Opera              9.80         6
Firefox            3.6.3        5
Firefox            3.6.12       4
Opera              9.24         4
IE                 5.5          4
Mozilla            1.9.2.16     3
Firefox            3.6.21       3
Firefox            3.6.6        3
Firefox            3.6.8        3
Firefox            4.0          3
Mozilla            4.0          3
Firefox            3.5.19       3
我需要对我的T-SQL做什么来组合具有相同主版本号和次版本号的版本,而不管其他版本号是什么?例如,我希望所有这些都被分组为3.6版

Firefox            3.6.20       42
Firefox            3.6.10       33
Firefox            3.6.18       10
Firefox            3.6.13       6
Firefox            3.6.3        5
Firefox            3.6.12       4
Firefox            3.6.21       3
Firefox            3.6.6        3
Firefox            3.6.8        3

非常糟糕,但是您可以使用此表达式替换
Version
,以获得第二个小数点之前的所有文本:

LEFT(Version, CHARINDEX('.', Version + '.', CHARINDEX('.', Version) + 1) - 1)

这假设每个版本至少有一个小数点(例如1.0)。

请注意,也许值得与一组已知的浏览器名称进行比较,而不是与bot名称进行排他性比较,我相信会有更少和类似的条件。这很混乱,因为这是一个
varchar
字段,所以你需要按角色来做。如果你有2或3位数的版本号怎么办?@JNK-这是C#提供的信息。如果我在代码中这样做,我会在“.”上拆分,然后只重新组合结果数组中的前2个,并按此排序,但我真的希望将其保留在SQL中。@sllev-我更希望有一个排除列表,而不是包含列表。有很多可能的浏览器类型可供选择,而且列表还在不断增加。我宁愿机器人程序滑入列表,也不愿错过一个bew移动浏览器用户代理。什么版本的SQL Server?所有行都至少有一个主版本号和次版本号吗?这是可行的,到目前为止(一个月的数据量),我没有一个,它们至少都是。为了安全起见,有没有办法不失败?将CHARINDEX('',Version)+1更改为CHARINDEX('',Version+')+1是否可以解决此问题?不,您必须将其更改为类似于CHARINDEX('',Version+'.0')+1的内容才能解决此问题。因为“+1”需要额外的字符。如果:LEFT(版本,大小写当CHARINDEX('.',Version)>0然后CHARINDEX('.',Version)-1否则LEN(版本)end)@user92546,那么“3.6.3”会发生什么情况?