2011-07-21 65 views
2

我有以下數據:需要使用SQL查詢幫助

 
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 

我需要得到以下信息:

  1. 擺在點登錄和簽收交易類型
  2. 之間的lane計數每個lane的總時間處於SignOn狀態,例如行與lane編號18爲12小時,與lane列20爲11小時,17分40秒
+6

這功課嗎? – dwo

+0

不,這不是作業 – Azat

+0

你有什麼試圖解決它? – dwo

回答

1

時間這將讓大部分......包括在每通道輸入/輸出多個標誌以及每個登錄/退出時間段內有多少次交易。一旦你得到了這個結果,你可以從THIS查詢獲得活動車道/會話總數與任何累積值......例如總共18次車輛登錄/註銷總銷售交易總次數,或總共多少車道是開放的,並且佔了這種銷售活動。

由於group by在lane,signon/off,我只是將MIN()應用於小時,分鐘和秒鐘,這對每個註冊/關閉會話都是一個常數。

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 
+0

謝謝你的回覆,你的解決方案真的幫助我! – Azat

1

以下時間確實爲多個點登錄不正確 - 每泳道簽收事件,但至少其一個開始。 如果我有關於每天允許多少登錄簽名事件和/或其他限制的信息,我會盡量調整它,以便在一般情況下可以正常工作。車道的

1.計數位於點登錄和簽收交易類型

SELECT  sales.lane, signon.transactiondate, count(*) as salecount 
FROM  table1 sales 
INNER JOIN table1 signon 
     ON (signon.lane = sales.lane AND signon.transactiontype = 'SignOn') 
INNER JOIN table1 signoff 
     ON (signoff.lane = sales.lane AND signoff.transactiontype = 'SignOff') 
WHERE  sales.transactiontype = 'Sale' 
      AND sales.transactiondate 
       BETWEEN signon.transactiondate AND signoff.transactiondate 
GROUP BY sales.lane, signon.transactiondate 

2.總時間各泳道是在點登錄狀態,例如間一行車道號碼18爲12小時,用20道排有11小時9分40秒

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 
+0

感謝您的回覆! – Azat