sql - 如何循环遍历表来查找数据集?

标签 sql sql-server sql-server-2008 tsql

我必须找到订单生命周期的时间差(以分钟为单位)。 即每个订单从收到订单(事件 ID 1)到键入(2)到打印(3)到交付(4)的时间

例如

我完全不知道应该采取哪种方法? 用例或 if then 语句?类似于 for every 循环遍历每条记录? 最有效的方法是什么?

我知道一旦我获得正确变量中的日期,我就可以使用 DATEDIFF。

declare @received as Datetime, @keyed as DateTime, @printed as Datetime, @Delivered as Datetime, @TurnTime1 as int
Select
IF (tblOrderActivity.ActivityID = 1) SET @received = tblOrderActivity.ActivityDate
---
----
from tblOrderActivity
where OrderID = 1 

它应该显示@TurnTime1 = 48分钟,因为orderID 1从接收(事件id 1)到键入(事件id 2)花了48分钟@TurnTime2 = 29分钟,因为订单1从键入(事件id 2)花了29分钟)到每个订单的打印(事件 ID 3)等等

最佳答案

您可以通过旋转数据轻松完成此操作。可以通过两种方式完成。

1.使用条件聚合来透视数据。在pivoting之后,您可以找到不同阶段之间的datediff。试试这个。

SELECT orderid,Received,Keyed,Printed,Delivered,
       Datediff(minute, Received, Keyed)    TurnTime1,
       Datediff(minute, Keyed, Printed)     TurnTime2,
       Datediff(minute, Printed, Delivered) TurnTime3
FROM  (SELECT OrderID,
              Max(CASE WHEN ActivityID = 1 THEN ActivityDate END) Received,
              Max(CASE WHEN ActivityID = 2 THEN ActivityDate END) Keyed,
              Max(CASE WHEN ActivityID = 3 THEN ActivityDate END) Printed,
              Max(CASE WHEN ActivityID = 4 THEN ActivityDate END) Delivered
       FROM   Yourtable
       GROUP  BY OrderID)A 

2.使用Pivot转置数据

SELECT orderid,
       [1]                        AS Received,
       [2]                        AS Keyed,
       [3]                        AS Printed,
       [4]                        AS Delivered,
       Datediff(minute, [1], [2]) TurnTime1,
       Datediff(minute, [2], [3]) TurnTime2,
       Datediff(minute, [3], [4]) TurnTime3
FROM   Yourtable
       PIVOT (Max(ActivityDate)
             FOR ActivityID IN([1],[2],[3],[4]))piv 

关于sql - 如何循环遍历表来查找数据集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28016136/

相关文章:

asp.net - 过程或函数指定的参数过多

sql - 如何在我的数据库中执行数据完整性规则?

sql - 如何获取数据库模式更改的 SQL 查询?

sql-server - 我可以在连接字符串中设置隔离级别吗?

基于更改存储过程的 SQL Server 2008 作业

sql - ServiceM8 自定义字段

sql - 将 .pdf 存储在 SQL 或路径中?

sql - 如果记录已存在,则停止在表中插入

Mysql,从另一个表的每条记录插入表

java - 使用 Play Framework 2 时显示 JPA 的 SQL 语句