繁体   English   中英

如何使用SQL查询仅显示一次计算值

[英]How to display the calculated value only one time using sql query

我有以下查询:

`

select e.empid, convert(char(5), tr.In_Time, 108) as In_time, 
        convert(char(5), tr.Out_Time, 108) as Out_time,
        convert(varchar(5), sum(datediff(minute, trr.In_Time, isnull(trr.Out_Time,       null))) / 60)
        + ':' +
        convert(varchar(5),sum(datediff(minute, trr.In_Time, isnull(trr.Out_Time,null))) % 60)
   as TotalHours,  

  from EMPLOYEES e
 Left Join EMPLOYEE_TIME tr
    on (e.empid=tr.empid)
 Left Join EMPLOYEE_TIME trr
    on (e.empid=trr.empid)
 where (
            trr.In_Time BETWEEN '2013-09-11' AND DATEADD(DAY, 1, '2013-09-11')
            and  tr.In_Time BETWEEN '2013-09-11' AND DATEADD(DAY, 1,  '2013-09-11')
        )  group by e.empid, tr.In_Time, tr.Out_Time e.JoiningDate    order  by e.JoiningDate ASC

`

执行以上查询后,我得到以下结果:

EmpID        in_time            out_time            totalhours  
1           9:30                18:00                   8:30  
2           10:00               13:00                   8:00  
2           14:00               19:00  
3           10:30               13:30                   3:00  
3           14:30               NULL                    3:00  

`

但是,当多个时间输入项Out_time为Null时 ,我不想两次打印totalhours ,如下所示:

`

EmpID        in_time            out_time            totalhours  
1           9:30                18:00                   8:30  
2           10:00               13:00                   8:00  
2           14:00               19:00  
3           10:30               13:30                   3:00  
3           14:30               NULL                      

`

有人可以帮我吗? 提前致谢

工作SQL

SELECT  e.empid ,
        CONVERT(CHAR(5), tr.In_Time, 108) AS In_time ,
        CONVERT(CHAR(5), tr.Out_Time, 108) AS Out_time ,
        CONVERT(VARCHAR(5), SUM(DATEDIFF(minute, trr.In_Time,
                                         ISNULL(trr.Out_Time, NULL))) / 60)
        + ':' + CONVERT(VARCHAR(5), SUM(DATEDIFF(minute, trr.In_Time,
                                                 ISNULL(trr.Out_Time, NULL)))
        % 60) AS TotalHours
FROM    EMPLOYEES e
        LEFT JOIN EMPLOYEE_TIME tr ON ( e.empid = tr.empid )
        LEFT JOIN EMPLOYEE_TIME trr ON ( e.empid = trr.empid )
WHERE   ( trr.In_Time BETWEEN '2013-09-11'
                      AND     DATEADD(DAY, 1, '2013-09-11')
          AND tr.In_Time BETWEEN '2013-09-11'
                         AND     DATEADD(DAY, 1, '2013-09-11')
        )
GROUP BY e.empid ,
        tr.In_Time ,
        tr.Out_Time ,
        e.JoiningDate
ORDER BY e.JoiningDate ASC

只需使用案例

喜欢

CASE WHEN Out_Time IS NOT NULL THEN convert(varchar(5),sum(datediff(minute, trr.In_Time, isnull(trr.Out_Time,null))) % 60)
    ELSE NULL END

根据您的示例,似乎您只希望每个EmpID的第一行中的小时数。 (如果不是,请使用例外的其他数据更新问题。)

假设这是使用row_number()的方法:

with yourquery as (<your query here>)
select EmpID, in_time, out_time,
       (case when seqnum = 1 then totalhours end) as totalhours
from (select yq.*,
             row_number() over (partition by EmpId order by in_time) as seqnum
      from yourquery yq
     ) yq;

编辑:

它应该是这样的:

with yourquery as (
    SELECT  e.empid ,
            CONVERT(CHAR(5), tr.In_Time, 108) AS In_time ,
            CONVERT(CHAR(5), tr.Out_Time, 108) AS Out_time ,
            CONVERT(VARCHAR(5), SUM(DATEDIFF(minute, trr.In_Time,
                                             ISNULL(trr.Out_Time, NULL))) / 60)
            + ':' + CONVERT(VARCHAR(5), SUM(DATEDIFF(minute, trr.In_Time,
                                                     ISNULL(trr.Out_Time, NULL)))
            % 60) AS TotalHours
    FROM    EMPLOYEES e
            LEFT JOIN EMPLOYEE_TIME tr ON ( e.empid = tr.empid )
            LEFT JOIN EMPLOYEE_TIME trr ON ( e.empid = trr.empid )
    WHERE   ( trr.In_Time BETWEEN '2013-09-11'
                          AND     DATEADD(DAY, 1, '2013-09-11')
              AND tr.In_Time BETWEEN '2013-09-11'
                             AND     DATEADD(DAY, 1, '2013-09-11')
            )
    GROUP BY e.empid ,
            tr.In_Time ,
            tr.Out_Time ,
            e.JoiningDate
    )
select yq.EmpID, yq.in_time, yq.out_time,
       (case when seqnum = 1 then yq.totalhours end) as totalhours
from (select yq.*,
             row_number() over (partition by yq.EmpId order by in_time) as seqnum
      from yourquery yq
     ) yq
ORDER BY yq.JoiningDate ASC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM