【问题标题】:Determining start/end times of intervals from individual transaction records从各个交易记录中确定间隔的开始/结束时间
【发布时间】:2017-07-22 15:24:18
【问题描述】:

我如何将数据从 table1 插入到 table2 我正在使用 MS Access。 这就是我想要的。

表 1

|id|    date    |  time |
| 3|  7/22/2017 |  8:00 |
| 3|  7/22/2017 | 17:00 |
| 4|  7/22/2017 |  8:00 |
| 4|  7/22/2017 | 12:00 |
| 4|  7/22/2017 | 13:00 |
| 4|  7/22/2017 | 17:00 |

我想把它放在新桌子上 表2

|id|working date|time-in|time-out|time-in|time-out|
| 3|  7/22/2017 |  8:00 |        |       | 17:00  |
| 4|  7/22/2017 |  8:00 | 12:00  | 13:00 | 17:00  |

是否可以循环使用,或者这是一个查询?请帮忙

【问题讨论】:

  • 在 MS Access 中成为可能和成为可能是两件不同的事情。这种类型的查询在 MS Access 中非常具有挑战性。
  • 是的。我已经在这上面花了一个星期。 :(
  • 多个重复的相同列 - timein1timein2 - 是一个糟糕的设计,因为它表明您错过了 1:m 关系。作为时钟类型的应用程序,它是非常有限的,因为紧急情况、医生预约等无法满足每天 2 对和只有 2 对进出对的需求。

标签: sql vb.net loops ms-access


【解决方案1】:

从执行不等自连接的查询开始,为按 [id] 和 [date] 分组的行分配顺序值

SELECT 
    t1.id,
    t1.date,
    t1.time,
    COUNT(*) AS seq
FROM
    Table1 t1
    INNER JOIN
    Table1 t2
        ON t1.id = t2.id AND t1.date = t2.date AND t1.time >= t2.time
GROUP BY t1.id, t1.date, t1.time

这给了我们

id  date        time      seq
--  ----------  --------  ---
 3  2017-07-22  08:00:00    1
 3  2017-07-22  17:00:00    2
 4  2017-07-22  08:00:00    1
 4  2017-07-22  12:00:00    2
 4  2017-07-22  13:00:00    3
 4  2017-07-22  17:00:00    4

将其包装在一个计算“标签”的查询中,该标签表示“in1”、“out1”、“in2”、“out2”等。

SELECT
    [id],
    [date],
    [time],
    IIf([seq] Mod 2 = 1, "in", "out") & ([seq] + 1) \ 2 AS tag
FROM
(
    SELECT 
        t1.id,
        t1.date,
        t1.time,
        COUNT(*) AS seq
    FROM
        Table1 t1
        INNER JOIN
        Table1 t2
            ON t1.id = t2.id AND t1.date = t2.date AND t1.time >= t2.time
    GROUP BY t1.id, t1.date, t1.time
)

生产

id  date        time      tag 
--  ----------  --------  ----
 3  2017-07-22  08:00:00  in1 
 3  2017-07-22  17:00:00  out1
 4  2017-07-22  08:00:00  in1 
 4  2017-07-22  12:00:00  out1
 4  2017-07-22  13:00:00  in2 
 4  2017-07-22  17:00:00  out2

然后将整个内容包装在交叉表查询中

TRANSFORM Min([time]) AS MinOftime
SELECT [id], [date]
FROM
(
    SELECT
        [id],
        [date],
        [time],
        IIf([seq] Mod 2 = 1, "in", "out") & ([seq] + 1) \ 2 AS tag
    FROM
    (
        SELECT 
            t1.id,
            t1.date,
            t1.time,
            COUNT(*) AS seq
        FROM
            Table1 t1
            INNER JOIN
            Table1 t2
                ON t1.id = t2.id AND t1.date = t2.date AND t1.time >= t2.time
        GROUP BY t1.id, t1.date, t1.time
    )
)
GROUP BY [id], [date]
PIVOT [tag]

为了最终结果

id  date        in1       in2       out1      out2    
--  ----------  --------  --------  --------  --------
 3  2017-07-22  08:00:00            17:00:00          
 4  2017-07-22  08:00:00  13:00:00  12:00:00  17:00:00

【讨论】:

  • 嗨,戈德,谢谢你的回答,我真的很喜欢它。但是当我在访问时尝试它作为查询它不起作用,这是否意味着我必须将它嵌入到我的 vb 中。网络代码?
  • @SamAlderete - 您的意思是您将查询保存在 Access 中,然后尝试从 VB.NET 调用该查询?另外,“它不[原文如此] 工作”到底是什么意思?
  • 嗨,戈德,非常感谢。现在看来它可以工作了,:)
  • 是的,我确实保存了查询,我想在 vb.net 上调用该查询。
  • 您好,可以将一个字段转移到另一个字段吗?像剪切和粘贴?使用 IIF
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多