【问题标题】:SQL CASE IF [VALUE] WHEN [Value] AND [VALUE] THENSQL CASE IF [VALUE] WHEN [Value] AND [VALUE] THEN
【发布时间】:2017-03-08 16:52:20
【问题描述】:

我不确定我是否过于复杂了这么小的任务,但如果有人可以在正确的方向上帮助我一点,那将不胜感激。

我有两个具有相同字段的表,我创建了一个将这两个值合二为一的视图。

目前我的声明是:

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

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

结果集出来为(sn-p):

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 语句是否会以某种方式适用于此,还是其他方面?

【问题讨论】:

  • 你能告诉我们想要的输出吗?
  • 您使用的是哪个 DBMS?

标签: sql case


【解决方案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 的行。如果您希望它在不匹配的情况下也能产生结果,您可以使用适当的外连接。

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      如果您的数据库支持,您可以使用 lead()lag() 窗口函数(您尚未标记数据库,但它看起来像 sql-server)

      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
      

      sql server 中的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       |
      +----------+-----------+---------------------+---------------------+----------+
      

      【讨论】:

        猜你喜欢
        • 2022-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2017-04-23
        • 1970-01-01
        • 2011-12-24
        • 1970-01-01
        相关资源
        最近更新 更多