ACCESS数据库表1
-----------------------------------
id   编号     姓名         日期              备注 
1     1       ABC        2010-10-1 08:15 
2     1       ABC        2010-10-1 12:00
3     1       ABC        2010-10-1 14:20
4     1       ABC        2010-10-1 17:30
5     1       ABC        2010-10-2 08:13 
6     1       ABC        2010-10-2 12:11
7     1       ABC        2010-10-2 14:22
8     1       ABC        2010-10-2 17:35 
9     2       ABCD       2010-10-1 08:10 
10    2       ABCD       2010-10-1 12:10
11    2       ABCD       2010-10-1 14:25
12    2       ABCD       2010-10-1 17:36
-----------------------------------------
现在我想得到
-------------------
编号   姓名     日期              a1                      a2                 a3                     a4
1      ABC     2010-10-1      2010-10-1 08:15      2010-10-1 12:00     2010-10-1 14:20       2010-10-1 17:30
1      ABC     2010-10-2      2010-10-2 08:13      2010-10-2 12:11     2010-10-2 14:22       2010-10-2 17:35
2      ABCD    2010-10-1      2010-10-1 08:10      2010-10-1 12:10     2010-10-1 14:25       2010-10-1 17:36
------------------
请问如何实现.
谢谢!

解决方案 »

  1.   

    TRANSFORM    PIVOT 日期
      

  2.   

    把表发过来  [email protected]
      

  3.   


    SELECT 编号, 姓名, 日期,
          max(iif(备注>=#8:00# and 备注<#12:00#,日期+备注)) as a1,
          max(iif(备注>=#12:00# and 备注<#14:00#,日期+备注)) as a2
    FROM 表1
    GROUP BY 编号, 姓名, 日期
    简单示例一下,时间间隔规则,取最大备注还是最小备注等规则自己的定...
      

  4.   

    id   编号   姓名        日期      时间                备注
    --------------------------------------------------------  
    1    1     ABC      2010-10-1     08:15  
    2    1     ABC      2010-10-1     12:00
    3    1     ABC      2010-10-1     14:20
    4    1     ABC      2010-10-1     17:30
    5    1     ABC      2010-10-2     08:13  
    6    1     ABC      2010-10-2     12:11
    7    1     ABC      2010-10-2     14:22
    8    1     ABC      2010-10-2     17:35  
    9    2    ABCD      2010-10-1     08:10  
    10   2    ABCD      2010-10-1     12:10
    11   2    ABCD      2010-10-1     14:25
    12   2    ABCD      2010-10-1     17:36
    ----------------------------------------------------------
    现在我想得到
    ------------------------------------------------------------
    编号     姓名        日期        a1     a2      a3     a4
    --------------------------------------------------------------
    1        ABC        2010-10-1   08:15   12:00   14:20  17:30
    1        ABC        2010-10-2   08:13   12:11   14:22  17:35
    2        ABCD       2010-10-1   08:10   12:10   14:25  17:36
    -----------------------------------------------------------------
    请问如何实现.
    谢谢!
      

  5.   

    id |  编号  |  姓名    |     日期      |  时间       |          备注
    ------------------------------------------------------------------
    1  |  1    | ABC     | 2010-10-1    | 08:15      |
    2  |  1    | ABC     | 2010-10-1    | 12:00      |
    3  |  1    | ABC     | 2010-10-1    | 14:20      |
    4  |  1    | ABC     | 2010-10-1    | 17:30      |
    5  |  1    | ABC     | 2010-10-2    | 08:13      |
    6  |  1    | ABC     | 2010-10-2    | 12:11      |
    7  |  1    | ABC     | 2010-10-2    | 14:22      |
    8  |  1    | ABC     | 2010-10-2    | 17:35      |
    9  |  2    | ABCD    | 2010-10-1    | 08:10      |
    10 |  2    | ABCD    | 2010-10-1    | 12:10      |
    11 |  2    | ABCD    | 2010-10-1    | 14:25      |
    12 |  2    | ABCD    | 2010-10-1    | 17:36      |
    ---------------------------------------------------------------
    现在我想得到
    -------------------------------------------------------------------
    编号   |   姓名     |   日期         |   a1   |   a2   |   a3   | a4
    --------------------------------------------------------------------
    1     |   ABC     |   2010-10-1  | 08:15  | 12:00  |14:20   | 17:30
    1     |   ABC     |   2010-10-2  |08:13   |12:11   |14:22   | 17:35
    2     |   ABCD    |   2010-10-1  | 08:10  |12:10   |14:25   | 17:36
    --------------------------------------------------------------------
    请问如何实现.
    谢谢!
      

  6.   

    5L楼的不行吗?稍改一下而已,不清楚你字段类型,我这个示例日期和备注都是date类型:SELECT 编号, 姓名, 日期,
          max(iif(备注>=#8:00# and 备注<#12:00#,备注)) as a1,
          max(iif(备注>=#12:00# and 备注<#14:00#,备注)) as a2,
          max(iif(备注>=#14:00# and 备注<#17:00#,备注)) as a3,
          max(iif(备注>=#17:00#,备注)) as a4
    FROM 表1
    GROUP BY 编号, 姓名, 日期
    或者jet下不行就用下面的:SELECT 编号, 姓名, 日期,
          max(iif(备注>=#8:00# and 备注<#12:00#,备注,null)) as a1,
          max(iif(备注>=#12:00# and 备注<#14:00#,备注,null)) as a2,
          max(iif(备注>=#14:00# and 备注<#17:00#,备注,null)) as a3,
          max(iif(备注>=#17:00#,备注,null)) as a4
    FROM 表1
    GROUP BY 编号, 姓名, 日期
      

  7.   

    按照     编号 姓名 日期 a1 a2 a3 a4    建表
    sele 1
    use oldtable
    sele 2
    use newtable
    sele 1
    scan
    m.编号=编号,m.姓名=姓名,m.日期=日期,m.时间=时间
    do case 
       case hour(m.时间)=8
       sele 2
       repl 编号, 姓名, 日期, a1 with  m.编号, m.姓名, m.日期,m.时间
       case hour(m.时间)=12
       sele 2
       repl 编号, 姓名, 日期, a2 with  m.编号, m.姓名, m.日期,m.时间
       case hour(m.时间)=14
       sele 2
       repl 编号, 姓名, 日期, a3 with  m.编号, m.姓名, m.日期,m.时间
       case hour(m.时间)=17
       sele 2
       repl 编号, 姓名, 日期, a1 with  m.编号, m.姓名, m.日期,m.时间
    endcase
    wait
      

  8.   

    按照 编号 姓名 日期 a1 a2 a3 a4 建表
    set talk off
    set time 24
    sele 1
    use oldtable
    sele 2
    use newtable
    sele 1
    scan
    m.编号=编号,m.姓名=姓名,m.日期=日期,m.时间=时间
    do case  
      case hour(m.时间)=8
      sele 2
      appe blank
      repl 编号, 姓名, 日期, a1 with m.编号, m.姓名, m.日期,m.时间
      case hour(m.时间)=12
      sele 2
      appe blank
      repl 编号, 姓名, 日期, a2 with m.编号, m.姓名, m.日期,m.时间
      case hour(m.时间)=14
      sele 2
      appe blank
      repl 编号, 姓名, 日期, a3 with m.编号, m.姓名, m.日期,m.时间
      case hour(m.时间)=17
      sele 2
      appe blank
      repl 编号, 姓名, 日期, a4 with m.编号, m.姓名, m.日期,m.时间
    endcase
    wait
    以上只是提供思路,在vfp中像这类数据库的问题是比较容易处理的,不知道vb是如何处理的?
    另外8楼的代码是如何判断备注字段的?楼主并没有说明备注字段的内容。
      

  9.   

    8楼的代码,楼主验证基本正确?我不懂为什么用GROUP BY 而且用max()。
    楼主难道不是需要旧表中所有的时间都需要导入到新表中?
      

  10.   

    楼主没有说明这个表存取的是什么,要实现什么,看了表的内容和楼主要实现的结果,猜想可能和考勤相关,上下班打卡只能取一次,不外呼取一个时段的最大时间或最大时间,因不不清楚楼主的规则,所以示例中用了max.....
    TO: 楼主
    如果考勤光靠你这个表的备注字段的时间来分班是不可靠的,三班倒的时间会有交叉的,在交叉的时间段,打卡的时间是上班还下斑几乎无法分清,特别还混有加班等情况,建议你修改下表结构,增加打卡时间字段,用备注标示是上班打卡还是下班打卡等信息...这样比较好处理...
      

  11.   

    id | 编号 | 姓名 | 日期 | 时间 | 备注
    ------------------------------------------------------------------
    1 | 1 | ABC | 2010-10-1 | 08:15 |
    2 | 1 | ABC | 2010-10-1 | 12:00 |
    3 | 1 | ABC | 2010-10-1 | 14:20 |
    4 | 1 | ABC | 2010-10-1 | 17:30 |
    5 | 1 | ABC | 2010-10-2 | 08:13 |
    6 | 1 | ABC | 2010-10-2 | 12:11 |
    7 | 1 | ABC | 2010-10-2 | 14:22 |
    8 | 1 | ABC | 2010-10-2 | 17:35 |
    9 | 2 | ABCD | 2010-10-1 | 08:10 |
    10 | 2 | ABCD | 2010-10-1 | 12:10 |
    11 | 2 | ABCD | 2010-10-1 | 14:25 |
    12 | 2 | ABCD | 2010-10-1 | 17:36 |
    ---------------------------------------------------------------
    现在我想一个比较慢的办法就是通过ACCESS查询语句得到如下
    id | 编号 | 姓名 | 日期 | 时间 |    备注
    ------------------------------------------------------------------
    1 | 1 | ABC | 2010-10-1 | 08:15 | 1
    2 | 1 | ABC | 2010-10-1 | 12:00 | 2
    3 | 1 | ABC | 2010-10-1 | 14:20 | 3
    4 | 1 | ABC | 2010-10-1 | 17:30 | 4
    5 | 1 | ABC | 2010-10-2 | 08:13 | 1
    6 | 1 | ABC | 2010-10-2 | 12:11 | 2
    7 | 1 | ABC | 2010-10-2 | 14:22 | 3
    8 | 1 | ABC | 2010-10-2 | 17:35 | 4
    9 | 2 | ABCD | 2010-10-1 | 08:10 | 1
    10 | 2 | ABCD | 2010-10-1 | 12:10 | 2
    11 | 2 | ABCD | 2010-10-1 | 14:25 | 3
    12 | 2 | ABCD | 2010-10-1 | 17:36 | 4
    ---------------------------------------------------------------
    也就是说,当我符合编号、姓名和日期相同时就后面自动编号从1开始。
    select 编号、 姓名 、日期、时间 from [表] group by 编号、姓名、日期。
    请问怎样可以达到。
      

  12.   

    以下语句可以达到,但是当数据量大时非常慢,(数据有10000多条时,执行要20分钟多,晕)
    请问有没有更好的办法,谢谢!(注:在ACCESS2003数据库里直接建查询和交叉表)
    语句一:(查询)
    SELECT id, 编号,姓名 日期, "时间" & dCount("时间","表1","时间<= #" & [时间] & "# and 日期 = #" & [日期] & "# and ID=" & [ID] & "") AS 时间段, 时间
    FROM 表1
    GROUP BY id, 编号,姓名 日期, "时间" & dCount("时间","表1","时间<= #" & [时间] & "# and 日期 = #" & [日期] & "# and ID=" & [ID] & ""),时间
    order by id, 编号,姓名 日期,时间
    语句二:(交叉表)
    TRANSFORM First(表1查询.时间) AS 时间之第一条记录
    SELECT 表1查询.ID,表1查询.编号,表1查询.姓名,表1查询.日期,表1查询.时间
    FROM 表1查询
    GROUP BY 表1查询.ID,表1查询.编号,表1查询.姓名,表1查询.日期,表1查询.时间
    PIVOT 表1查询.时间段;