【问题标题】:Setting two column values from Single Column using sql query使用 sql 查询从单列设置两列值
【发布时间】:2013-05-06 07:14:26
【问题描述】:

我有一张包含以下详细信息的表格

ID    statusID  logTime
100238  1   2011-07-07 03:48:43.000
100238  2   2011-07-07 03:48:46.000
100238  1   2011-07-07 09:07:57.000
100238  2   2011-07-07 16:12:28.000
100238  1   2011-07-08 02:59:57.000
100238  2   2011-07-08 03:00:00.000
100238  1   2011-07-08 09:26:37.000
100238  2   2011-07-08 14:03:05.000

所需的输出应该是这样的

repID   ClockIn                    ClockOut
100238  2011-07-07 03:48:43.000    2011-07-07 03:48:46.000
100238  2011-07-07 09:07:57.000    2011-07-07 16:12:28.000
100238  2011-07-08 02:59:57.000    2011-07-08 03:00:00.000
100238  2011-07-08 09:26:37.000    2011-07-08 14:03:05.000

ie.. 如果 statusID 为 1,则 logtime 必须在 ClockIn 列中,如果 statusID 为 2,则 logtime 必须在 ClockOut 列中

我使用过类似的查询

SELECT repID,
       ClockIn,
       ClockOut from
  (SELECT a.eventID, 
          a.repID, 
          a.logTime, 
          CASE WHEN a.statusID = 1 THEN a.logTime ELSE NULL END AS ClockIn, 
          CASE WHEN b.statusID = 2 THEN b.logTime ELSE NULL END AS ClockOut
   FROM tbl_ets_reptimelog a
   LEFT JOIN tbl_ets_reptimelog b ON a.repID = b.repID)c

结果是这样的

repID   ClockIn                     ClockOut
100238  2011-07-07 03:48:43.000     NULL
100238  2011-07-07 03:48:43.000     2011-07-07 03:48:46.000
100238  2011-07-07 09:07:57.000     NULL
100238  2011-07-07 09:07:57.000     2011-07-07 16:12:28.000
100238  2011-07-08 02:59:57.000     NULL
100238  2011-07-08 02:59:57.000     2011-07-08 03:00:00.000
100238  2011-07-08 09:26:37.000     NULL
100238  2011-07-08 09:26:37.000     2011-07-08 14:03:05.000

如何删除在 ClockOut 列中出现的带有 NULL 值的额外行

请帮助解决这个问题......

【问题讨论】:

    标签: mysql sql join sql-server-2008-r2


    【解决方案1】:

    只需在外部查询中添加一个 WHERE 子句

    select repID,ClockIn,ClockOut from(select a.eventID, a.repID, a.logTime, 
    case when a.statusID = 1 then a.logTime else null end as ClockIn,  
    case when b.statusID = 2 then b.logTime else null end as ClockOut from tbl_ets_reptimelog a 
    left join tbl_ets_reptimelog b on a.repID = b.repID)c
    WHERE ClockOut IS NOT NULL
    

    【讨论】:

      【解决方案2】:

      这个查询应该返回你需要的结果:

      SELECT
        t1.ID,
        t1.logTime check_in,
        CASE WHEN MIN(t2.logTime) < MIN(t3.logTime) OR MIN(t3.logTime) IS NULL
             THEN MIN(t2.logTime) END check_out
      FROM
        Logs t1 LEFT JOIN Logs t2
        ON t1.ID = t2.ID
           AND t2.statusID=2
           AND t1.logTime<t2.logTime
        LEFT JOIN Logs t3
        ON t2.ID = t3.ID
           AND t3.statusID=1
           AND t1.logTime<t3.logTime
      WHERE
        t1.statusID=1
      GROUP BY
        t1.ID, t1.logTime
      

      请看小提琴here

      【讨论】:

      • 感谢您的回复...它删除了空列。但是有可能一个 ID 只有签入时间。在这种情况下,我们必须将 Check_out 列显示为空。例如:使用 foll 查询 CREATE TABLE Logs ( ID int, statusID int, logTime DATETIME) 进行检查;插入日志值 (100238 , 1 , '2011-07-07 03:48:43.000'), (100238 , 1 , '2011-07-07 09:07:57.000'), (100238 , 1 , '2011- 07-08 02:59:57.000'), (100238, 2, '2011-07-08 03:00:00.000'), (100238, 1, '2011-07-08 09:26:37.000'), ( 100238 , 2 , '2011-07-08 14:03:05.000')
      • @Renuka 好的,我明白了......你说得对,在这种情况下它不能正常工作......让我想想如何解决这个问题
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      相关资源
      最近更新 更多