【问题标题】:select into single column from instead 4 different columns?从 4 个不同的列中选择单列?
【发布时间】:2013-12-26 14:33:28
【问题描述】:

我试图在案例陈述中使用 4 个不同的列(Case_Close、Case_Open、Case_Comment、Case_Retrieve) 将所有内容放在单个列中,不知道该怎么做。 我到现在为止是:

 select report_id,
    user_id,
    action_type,
    action_start,
    action_end ,
    CASE WHEN ACTION_END is null THEN  case ACTION_TYPE when 'CLOSE' then ACTION_START  end  END as Case_Close,
    CASE WHEN ACTION_END is null THEN  case ACTION_TYPE when 'OPEN' then GETDATE() end END as Case_Open,
    CASE WHEN ACTION_END is null THEN  case ACTION_TYPE when 'COMMENT' then GETDATE() end END as Case_Comment,
    CASE WHEN ACTION_END is null THEN  case ACTION_TYPE when 'RETRIEVE' then GETDATE() end END as Case_Retrieve

    from Table1
    order by report_id

看起来像这样:

report_id            user_id     action_type action_start            action_end              Case_Close              Case_Open               Case_Comment            Case_Retrieve
-------------------- ----------- ----------- ----------------------- ----------------------- ----------------------- ----------------------- ----------------------- -----------------------
20122511549-621      621         CLOSE       2012-02-19 10:53:28.000 NULL                    2012-02-19 10:53:28.000 NULL                    NULL                    NULL
20122511549-621      621         OPEN        2012-02-05 11:05:49.000 2012-02-19 10:53:28.000 NULL                    NULL                    NULL                    NULL
20132121098-621      621         OPEN        2013-02-12 10:09:08.807 2013-02-12 11:16:17.167 NULL                    NULL                    NULL                    NULL
20132121098-621      621         COMMENT     2013-02-12 11:16:17.167 NULL                    NULL                    NULL                    2013-12-26 14:55:12.017 NULL
201321814390-621     621         OPEN        2013-02-18 14:39:00.157 NULL                    NULL                    2013-12-26 14:55:12.017 NULL                    NULL
201322010148-707     707         OPEN        2013-02-20 10:01:48.693 2013-10-29 13:22:05.017 NULL                    NULL                    NULL                    NULL
201322010148-707     707         RETRIEVE    2013-10-29 13:22:05.017 NULL                    NULL                    NULL                    NULL                    2013-12-26 14:55:12.017
2013222142012-621    621         OPEN        2013-02-22 14:20:12.327 NULL                    NULL                    2013-12-26 14:55:12.017 NULL                    NULL
2013225102516-707    707         OPEN        2013-02-25 10:25:16.790 2013-02-25 10:47:05.890 NULL                    NULL                    NULL                    NULL
2013225102516-707    707         OPEN        2013-02-04 13:48:38.293 2013-10-28 13:22:09.110 NULL                    NULL                    NULL                    NULL
201324134838-707     707         RETRIEVE    2013-10-28 13:22:09.110 NULL                    NULL                    NULL                    NULL                    2013-12-26 14:55:12.017

我需要的是喜欢这个:

report_id            user_id     action_type action_start            action_end              Column_Action_End      
-------------------- ----------- ----------- ----------------------- ----------------------- -----------------------
20122511549-621      621         CLOSE       2012-02-19 10:53:28.000 NULL                    2012-02-19 10:53:28.000
20122511549-621      621         OPEN        2012-02-05 11:05:49.000 2012-02-19 10:53:28.000 NULL                   
20132121098-621      621         OPEN        2013-02-12 10:09:08.807 2013-02-12 11:16:17.167 NULL                   
20132121098-621      621         COMMENT     2013-02-12 11:16:17.167 NULL                    2013-12-26 14:55:12.017
201321814390-621     621         OPEN        2013-02-18 14:39:00.157 NULL                    2013-12-26 14:55:12.017
201322010148-707     707         OPEN        2013-02-20 10:01:48.693 2013-10-29 13:22:05.017 NULL                   
201322010148-707     707         RETRIEVE    2013-10-29 13:22:05.017 NULL                    2013-12-26 14:55:12.017
2013222142012-621    621         OPEN        2013-02-22 14:20:12.327 NULL                    2013-12-26 14:55:12.017
2013225102516-707    707         OPEN        2013-02-25 10:25:16.790 2013-02-25 10:47:05.890 NULL                   
2013225102516-707    707         OPEN        2013-02-04 13:48:38.293 2013-10-28 13:22:09.110 NULL                   
201324134838-707     707         RETRIEVE    2013-10-28 13:22:09.110 NULL                    2013-12-26 14:55:12.017

如果有人可以帮助我,我将不胜感激?

【问题讨论】:

  • 您是否尝试在“action_end”为空时填写?您可以在同一列中执行此操作...使用 coalesce 或 isnull。
  • 谢谢你们所有的人,我尝试了你们所有的答案并为我工作:)

标签: sql-server select case multiple-columns


【解决方案1】:
select report_id,
    user_id,
    action_type,
    action_start,
    action_end ,
    CASE 
        WHEN ACTION_END is null AND ACTION_TYPE = 'CLOSE' then ACTION_START
        WHEN ACTION_END is null AND ACTION_TYPE IN ('OPEN', 'COMMENT', 'RETRIEVE') then GETDATE()
        ELSE NULL 
    END as Column_Action_End

from Table1
order by report_id

【讨论】:

    【解决方案2】:

    您可以将 case 语句合并为一个,并在每个 WHEN 子句中包含两个条件:

    SELECT 
        report_id,
        user_id,
        action_type,
        action_start,
        action_end,
        CASE 
            WHEN ACTION_END is null and ACTION_TYPE = 'CLOSE' then ACTION_START 
            WHEN ACTION_END is null and ACTION_TYPE = 'OPEN' then GETDATE()
            WHEN ACTION_END is null and ACTION_TYPE = 'COMMENT' then GETDATE()
            WHEN ACTION_END is null and ACTION_TYPE = 'RETRIEVE' then GETDATE()
        END as Column_Action_End
    FROM Table1
    ORDER BY report_id
    

    【讨论】:

      【解决方案3】:

      您可以使用嵌套的 case 表达式:

      Select report_id, user_id, action_type, action_start, action_end ,
          Case When ACTION_END is null
               Then Case When ACTION_TYPE = 'CLOSE' Then ACTION_START
                         When ACTION_TYPE IN ('OPEN','COMMENT', 'RETRIEVE') Then GETDATE() 
                    --Else ... (if you need else part for sub case expression) 
                    End
          --Else ...(if you need else part for main Case expression)
          End As Column_Action_End
      From Table1
      Order by report_id
      

      【讨论】:

        【解决方案4】:

        您可以合并以检查 action_end 是否为空。

        如果只有 4 种操作类型并且不是可为空的列,那么您只需检查“CLOSE”...

        select report_id,
            user_id,
            action_type,
            action_start,
            coalesce(action_end,case when ACTION_TYPE = 'CLOSE' then ACTION_START else getdate() end) as action_end
        from Table1
        

        否则,您必须检查所有 4 个...

        select report_id,
            user_id,
            action_type,
            action_start,
            coalesce(action_end,case when ACTION_TYPE = 'CLOSE' then ACTION_START when ACTION_TYPE in ('OPEN','COMMENT','RETRIEVE') then getdate() end) as action_end
        from Table1
        

        【讨论】:

        • 谢谢 sam yi,这对我有更多帮助
        猜你喜欢
        • 2010-11-01
        • 1970-01-01
        • 2012-11-15
        • 1970-01-01
        • 2016-05-14
        • 2017-09-21
        • 2019-05-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多