需要SQL查询的帮助吗

需要SQL查询的帮助吗,sql,sql-server,Sql,Sql Server,我有以下资料: TransactionType Lane TransactionDate ------------------------------------------------ Sale 17 2011-07-21 06:15:34 SignOn 18 2011-07-21 07:00:00 Sale 18 2011-07-21 07:06:

我有以下资料:

TransactionType Lane TransactionDate ------------------------------------------------ Sale 17 2011-07-21 06:15:34 SignOn 18 2011-07-21 07:00:00 Sale 18 2011-07-21 07:06:43 SignOn 20 2011-07-21 08:01:12 Sale 18 2011-07-21 07:30:00 Sale 18 2011-07-21 08:30:00 Sale 18 2011-07-21 09:30:50 Sale 20 2011-07-21 10:15:34 SignOff 18 2011-07-21 19:00:00 SignOff 20 2011-07-21 19:10:52 TransactionType Lane TransactionDate ------------------------------------------------ 销售17 2011-07-2106:15:34 签名18 2011-07-21 07:00:00 销售18 2011-07-21 07:06:43 签名20 2011-07-21 08:01:12 销售18 2011-07-21 07:30:00 销售18 2011-07-21 08:30:00 销售18 2011-07-21 09:30:50 销售20 2011-07-21 10:15:34 签字18 2011-07-21 19:00:00 签字20 2011-07-21 19:10:52 我需要获得以下信息:

  • 介于签入和签出交易类型之间的
    lane
    计数
  • 每个
    车道
    处于登录状态的总时间,例如带有
    车道
    编号18的行为12小时,带有
    车道
    20的行为11小时9分40秒

  • 以下内容不适用于每条车道的多个登录-注销事件,但至少是一个开始。 如果我有关于每天允许多少登录注销事件和/或其他限制的信息,我将尝试调整它,使其在一般情况下工作

    1.位于登录和注销交易类型之间的通道计数

    2.每条车道处于信号状态的总时间,例如,车道号为18的世界其他地区为12小时,车道号为20的世界其他地区为11小时9分40秒


    这将得到它的大部分。。。包括每个通道的多个登录/注销以及每个登录/注销时间段内的交易数量。一旦您得到这个结果,您就可以从中进行查询,以获得具有任何汇总值的活动车道/会话的总计数。。。例如,第18条通道的总签入/签出时间、总销售交易记录,或者仅仅是总的开放通道数量以及此类销售活动的占比

    由于group by在通道上,signon/off,所以我只对小时、分钟、秒应用了MIN(),这在每个signon/off会话中始终是一个常量

    SELECT 
          PreQuery.Lane,
          PreQuery.SignedOn,
          PreQuery.SignedOff,
          MIN( datediff(hour, PreQuery.SignedOn, PreQuery.SignedOff )) as hours,
          MIN( datediff(minute, PreQuery.SignedOn, PreQuery.SignedOff )) as minutes,
          MIN( datediff(second, PreQuery.SignedOn, PreQuery.SignedOff )) as seconds,
          COUNT(*) as NumOfSales 
       from 
          ( SELECT 
                  T1.Lane,
                  T1.TransactionDate SignedOn,
                  MIN( T2.TransactionDate ) as SignedOff
               from 
                  Trans1 T1
                     LEFT JOIN Trans1 T2
                        ON T1.Lane = T2.Lane
                        AND T2.TransactionType = "SignOff"
                        AND T2.TransactionDate > T1.TransactionDate 
               where 
                  T1.TransactionType = "SignOn" 
               group by 
                  T1.Lane,
                  T1.TransactionDate ) PreQuery 
          LEFT Join Trans1 T3 
             on PreQuery.Lane = T3.Lane 
            AND T3.TransactionType = "Sale" 
            AND T3.TransactionDate BETWEEN PreQuery.SignedOn AND PreQuery.SignedOff
       GROUP BY 
          PreQuery.Lane,
          PreQuery.SignedOn,
          PreQuery.SignedOff
    

    这是家庭作业吗?不,这不是家庭作业,你试图解决什么问题?你的服务器是什么?通道SQL小姐?MYSQL?此查询必须是一个或两个不同的查询?输入参数是什么?我想他指的是每个Lanethan的销售额。谢谢你的回复,你的解决方案确实帮了我的忙!
    SELECT      signon.lane,
                datediff(hour, signon.transactiondate, signoff.transactiondate) as hours,
                datediff(minute, signon.transactiondate, signoff.transactiondate) as minutes,
                datediff(second, signon.transactiondate, signoff.transactiondate) as seconds,
    
    FROM        table1 signon
    INNER JOIN  table1 signoff 
            ON    (signoff.lane = signon.lane 
                  AND signoff.transactiondate > signon.transactiondate
                  AND signoff.transactiontype = 'SignOff')
    WHERE       signon.transactiontype = 'SignOn'                               
    GROUP BY    signon.lane, signon.transactiondate
    
    SELECT 
          PreQuery.Lane,
          PreQuery.SignedOn,
          PreQuery.SignedOff,
          MIN( datediff(hour, PreQuery.SignedOn, PreQuery.SignedOff )) as hours,
          MIN( datediff(minute, PreQuery.SignedOn, PreQuery.SignedOff )) as minutes,
          MIN( datediff(second, PreQuery.SignedOn, PreQuery.SignedOff )) as seconds,
          COUNT(*) as NumOfSales 
       from 
          ( SELECT 
                  T1.Lane,
                  T1.TransactionDate SignedOn,
                  MIN( T2.TransactionDate ) as SignedOff
               from 
                  Trans1 T1
                     LEFT JOIN Trans1 T2
                        ON T1.Lane = T2.Lane
                        AND T2.TransactionType = "SignOff"
                        AND T2.TransactionDate > T1.TransactionDate 
               where 
                  T1.TransactionType = "SignOn" 
               group by 
                  T1.Lane,
                  T1.TransactionDate ) PreQuery 
          LEFT Join Trans1 T3 
             on PreQuery.Lane = T3.Lane 
            AND T3.TransactionType = "Sale" 
            AND T3.TransactionDate BETWEEN PreQuery.SignedOn AND PreQuery.SignedOff
       GROUP BY 
          PreQuery.Lane,
          PreQuery.SignedOn,
          PreQuery.SignedOff