做个统计GPS考勤位置的统计。
考勤记录表如下id     GPS
1     123.32356
1     123.32379
1     123.40267
2     123.55478
2     123.32489     我想统计某人在几个地方打了几次卡,取GPS前6位为比较基准
员工1 在两个地址打3次,员工2 在两个地方打两次
希望得到
ID    GPS       该处打卡次数
1     123.32    2
1     123.40    1
2     123.55    1
2     123.32    1类似这样吧,如果能够下面这样就更好了
ID    GPS       该处次数     几个地点
1     123.32    2              2
1     123.40    1              2
2     123.55    1              2
2     123.32    1              2我用的SQL08 语句:(没办法 distinct 只能放开头,顺序无所谓了 )
select
 distinct  convert(CHAR(6),gps)  ,ID , count( convert(CHAR(6))
得到的是GPS           ID         该处打卡几次
123.32        1            1
123.32        1            1
123.40        1            1
123.55         2           1
123.32        2             1很明显 打卡次数列虽然用convertt转换,但是count函数实际比较的还是整个字符串没有真的只取6位
   ( left ( GPS, 6 ) )效果一样。
我发现 distinct 是真的好使的,真的只计算取的6位,无奈distinct只能在开头用一次。
求教!

解决方案 »

  1.   

     count( convert(CHAR(6))没必要,直接写成 count(*) 就可以了;
      

  2.   

    select id,substring(ltrim(gps),1,6),count(1),(select count(distinct substring(ltrim(gps),1,6)) from tb tb2 where tb1.id=tb2.id) from tb tb1 group by  id,substring(replace(gps,'.',''),1,6) ,substring(ltrim(gps),1,6)
      

  3.   

    with Cr_a
    as
    (select 1 as id,123.32356 as gps
    union 
    select 1 as id,123.32379 as gps
    union select 1 as id,123.40267 as gps
    union select 2 as id,123.55478 as gps
    union select 2 as id,123.32489  as gps
     )select id,cast(gps as numeric(18,2)) gps,COUNT(1) 该处打卡次数 from Cr_a group by id,cast(gps as numeric(18,2))
    order by id,gps
      

  4.   

    2012之后的版本可以这样用
    WITH CTE(id,GPS) AS(
    SELECT 1,'123.32356'
    UNION ALL SELECT 1,'123.32379'
    UNION ALL SELECT 1,'123.40267'
    UNION ALL SELECT 2,'123.55478'
    UNION ALL SELECT 2,'123.32489'
    )
    SELECT CTE.id,LEFT(CTE.GPS,6),COUNT(*),
    COUNT(*) OVER (PARTITION BY id) AS Place
    FROM CTE
    GROUP BY CTE.id,LEFT(CTE.GPS,6)
      

  5.   

    感谢各位大神!使用3楼 @hjywyj   方法可行 ,还写了同其他表对比,十分感谢。
    感谢2楼告知 count(*) 就行,真不知道....我原来以为是let 等方法取的左截位并不准确,还以为count 统计整个数,而不是取的位数。
    后来发现原来是最后的group  by 语句写的有问题,必须 group by   ( left ( GPS, 6 ) 这样才有效果,只 group by GPS不行。
    SQL太闹腾,已经被group by折腾懵过无数次了下面两位大神的解答我也实验一下,一并感谢!
      

  6.   

    @kaznbaa163  @KanzakiOrange 你们的回答太深奥了...
    我得先去查 with as 啥意思,看了半天都忘了我的问题是啥了,能推荐含有with as这种函数的SQL书么?最好是SQL2014
    国内的书大部分太扯淡了,换个号码,05\08\14就发行,内容都不改。
      

  7.   

    with as 里边的内容是测试数据,方便下边写测试语句,不用管