2017-03-16 19 views
0

でケースを使用しようと、私はテーブルを持っているenter image description here は私が報告して2つのクエリ以下の書いた -SQL-Serverクエリ

SELECT [unityTimeStamp], datediff(hour, unityTimeStamp, getdate())difference_by_hours, datediff(minute, unityTimeStamp, getdate())difference_by_minutes 
FROM [VansoAlertDB].[dbo].[Vanso] WHERE [unityTimeStamp]>dateadd(hour,-10,getdate()) and deliverystatus = 'P' 

SELECT [sent_at], datediff(hour, sent_at, getdate())difference_by_hours, datediff(minute, sent_at, getdate())difference_by_minutes 
FROM [VansoAlertDB].[dbo].[Vanso] WHERE [unityTimeStamp]>dateadd(hour,-10,getdate()) and deliverystatus = 'S' 

をいいえ、私は書いてみましたなかったですすべてのトランザクションが1時間以内に行われたかどうかをチェックするクエリ.1の値は新しい列S1hrに0を代入する必要があります。同様に、30分以内にトランザクションが正常に送信されたかどうかを確認します1以外の値を0に割り当てます。

保留中のトランザクションの場合は、unityTimeStamp現在のタイムスタンプとして反対の列とP1hr> =他に1時間0、および1が他P30min < = 30分0

場合、私はこの試みた場合は1を割り当てる - しかし、私は得続ける

SELECT 
case when max(deliverystatus)='S' and  datediff(hour,getdate(),max(sent_at))>=1 then 1 else 0 end S1hr, 
case when max(deliverystatus)='S' and datediff(minute,getdate(),max(sent_at))>=30 then 1 else 0 end S30min, 
case when max(deliverystatus)='P' and datediff(hour,getdate(),max(unityTimeStamp))>=1 then 1 else 0 end P1hr, 
case when max(deliverystatus)='P' and datediff(minute,getdate(),max(unityTimeStamp))>=30 then 1 else 0 end P30min 
FROM [VansoAlertDB].[dbo].[Vanso] WHERE [unityTimeStamp]>dateadd(hour,-10,getdate()) 

を -

S1hr, S30min, P1hr, P30min 

0 , 1  , 0 , 0 

希望の結果を得るためにCASE文を使用するにはどうすればよいですか?

送信されたクエリ

Sent/Processed transactions from the query mentioned above

sent_at    destinationAddress difference_by_hours difference_by_minutes 
2017-03-16 08:15:00 08060293904   7 440 
2017-03-16 08:15:00 08165777415   7 440 
2017-03-16 08:15:00 08035001717   7 440 
2017-03-16 08:16:00 08185200110   7 439 
2017-03-16 08:15:00 08092717339   7 440 
2017-03-16 08:15:00 2347055686321   7 440 

保留中のクエリ

Pending transactions from the query mentioned above

unityTimeStamp destinationAddress difference_by_hours difference_by_minutes 
2017-03-16 09:14:00 08062313735  6     405 
2017-03-16 09:14:00 2348036736566  6     405 
2017-03-16 09:14:00 08022621333  6     405 
2017-03-16 09:14:00 08034859672  6     405 
2017-03-16 09:14:00 2347013038026  6     405 
2017-03-16 09:14:00 2348060472208  6     405 
+0

サンプルテーブルのデータと期待される結果も書式付きテキストで追加してください。 – TheGameiswar

+0

あなたの 'datediff'は、' sent_at'が未来でなければ常に '( - )'の値を返します。あなたは周りの日付を交換する必要があります – Stephen

+0

@TheGameiswar私は保留中と送信されたクエリの結果を追加しました。トランザクションが1時間30分以上保留されているため、P1hrとP30minは1を返します。 –

答えて

1

私が正しく理解していれば、あなたが戻って、クエリからの単一の行を期待しています各猫の注文数を表示する倫理?このようなもの?

select 
sum(case when deliverystatus='S' and datediff(hour,getdate(),sent_at)>=1 then 1 else 0 end) S1hr, 
sum(case when deliverystatus='S' and datediff(minute,getdate(),sent_at)>=30 then 1 else 0 end) S30min, 
sum(case when deliverystatus='P' and datediff(hour,unityTimeStamp,getdate())>=1 then 1 else 0 end) P1hr, 
sum(case when deliverystatus='P' and datediff(minute,unityTimeStamp,getdate())>=30 then 1 else 0 end) P30min 
from [VansoAlertDB].[dbo].[Vanso] where [unityTimeStamp]>dateadd(hour,-10,getdate()) 
+0

これはうまくいきました。ありがとうございました。 P30Minの場合、私はわずかに変更しました(deliverystatus = 'P'と日付(分、unityTimeStamp、getdate())<= 30、次に1 else 0 end)P30min –