2017-03-08 11 views
1

私はこのような小さな仕事を複雑にしているかどうかはわかりませんが、 。SQLの場合[VALUE] WHEN [VALUE] AND [VALUE] THEN

私は同じフィールドを持つ2つのテーブルを持っています。これらの値の両方を1つに持つビューを作成しました。それは私が持っている文をスタンドとして

は次のとおりです。

SELECT TOP 1000 [Name] 
     ,[WorkOrder] 
     ,[OnSiteStarted] 
     ,[OnSiteSubmitted] 

    FROM [DBName].[dbo].[sw_onsite_offsite] 
    ORDER BY WorkOrder 

結果セットは(スニペット)として出てくる:

Name  WorkOrder  OnSiteStarted   OnSiteSubmitted 
On-Site  23022017 2017-02-23 20:31:49.000 2017-02-23 20:33:47.000 
Off-Site  35  2017-02-15 18:32:26.000 2017-02-15 21:11:04.000 
On-Site  64169086 2017-02-22 11:42:40.000 2017-02-22 15:10:17.000 
Off-Site 91487689 2017-02-11 13:48:11.000 2017-02-11 14:32:37.000 
On-Site  91494707 2017-02-13 14:39:42.000 2017-02-13 14:49:03.000 
Off-Site 92810031 2017-02-17 09:30:59.000 2017-02-17 09:58:19.000 
On-Site  92810031 2017-02-17 09:00:12.000 2017-02-17 09:30:48.000 
Off-Site 92810034 2017-02-17 10:01:27.000 2017-02-17 10:24:45.000 
On-Site  92810039 2017-03-03 12:33:41.000 2017-03-03 12:52:37.000 
Off-Site 92810039 2017-03-03 12:44:52.000 2017-03-03 13:41:35.000 

私は後にしています最終的な結果は次のとおりです。ときにオフサイトオンサイトフォームのWorkOrder番号が同じであれば、これはDATEDIFF(MINUTES、[onsitesubmitted]、[offsitesubmitted]フィールドとのみ表示されます)

CASE文は適用可能でしょうか?これはどういうわけか、それとも別のものになるのでしょうか?私はあなたが自己をしたいと思います

+0

あなたは私たちにデザイアーズを表示することができますedの出力? – Forklift

+0

どのDBMSを使用していますか? –

答えて

1

参加:

select t1.WorkOrder, 
    DATEDIFF(MINUTES, t1.onsitesubmitted, t2.OnSiteSubmitted) diff 
from [DBName].[dbo].[sw_onsite_offsite] t1 
join [DBName].[dbo].[sw_onsite_offsite] t2 on t1.WorkOrder = t2.WorkOrder 
where t1.name = 'On-Site' 
    and t2.name = 'Off-Site' 

このリターンオフサイトおよびオンサイトの両方に存在同じWorkOrderはを持つ行のみ。一致しない場合でも結果を生成したい場合は、適切な外部結合を使用できます。 SQL Serverの中

1
SELECT onsite.[WorkOrder], 
     DATEDIFF(MINUTES, onsite.OnSiteSubmitted, offsite.OnSiteSubmitted) 
FROM [DBName].[dbo].[sw_onsite_offsite] onsite join [DBName].[dbo].[sw_onsite_offsite] offsite on onsite.WorkOrder = offsite.WorkOrder 
WHERE onsite.Name = 'On-Site' AND 
     offsite.Name = 'Off-Site' 
ORDER BY WorkOrder 
1

データベースがそれをサポートしている場合は、(データベースをタグ付けしていないが、それは、SQLサーバのように見える)lead()またはlag()ウィンドウ関数を使用することができ

select 
    Name 
    , WorkOrder 
    , OnSiteStarted 
    , OnSiteSubmitted 
    , datediff(minute 
     , lead([onsitesubmitted]) over (
      partition by WorkOrder 
      order by Name 
     ) 
     , [onsitesubmitted] 
    ) as Duration 
from [dbo].[sw_onsite_offsite] 
order by WorkOrder, OnSiteSubmitted 

rextesterデモ: http://rextester.com/OTNS68646

リターン:

+----------+-----------+---------------------+---------------------+----------+ 
| Name | WorkOrder | OnSiteStarted | OnSiteSubmitted | Duration | 
+----------+-----------+---------------------+---------------------+----------+ 
| Off-Site |  35 | 2017-02-15 18:32:26 | 2017-02-15 21:11:04 | NULL  | 
| On-Site | 23022017 | 2017-02-23 20:31:49 | 2017-02-23 20:33:47 | NULL  | 
| On-Site | 64169086 | 2017-02-22 11:42:40 | 2017-02-22 15:10:17 | NULL  | 
| Off-Site | 91487689 | 2017-02-11 13:48:11 | 2017-02-11 14:32:37 | NULL  | 
| On-Site | 91494707 | 2017-02-13 14:39:42 | 2017-02-13 14:49:03 | NULL  | 
| On-Site | 92810031 | 2017-02-17 09:00:12 | 2017-02-17 09:30:48 | NULL  | 
| Off-Site | 92810031 | 2017-02-17 09:30:59 | 2017-02-17 09:58:19 | 28  | 
| Off-Site | 92810034 | 2017-02-17 10:01:27 | 2017-02-17 10:24:45 | NULL  | 
| On-Site | 92810039 | 2017-03-03 12:33:41 | 2017-03-03 12:52:37 | NULL  | 
| Off-Site | 92810039 | 2017-03-03 12:44:52 | 2017-03-03 13:41:35 | 49  | 
+----------+-----------+---------------------+---------------------+----------+