使用GROUPBY进行SQL选择

使用GROUPBY进行SQL选择,sql,sql-server,Sql,Sql Server,请帮我查询,我有这个查询请看下面 select empnam as Emp_Name,seccod as DEPT,'' as REMARKS ,MAX(CASE WHEN STAT = 'IN' THEN clktim END)[IN] ,MAX(CASE WHEN STAT = 'OUT' THEN clktim END) OUT from (select a.clkid, case when a.devid = '10' then '

请帮我查询,我有这个查询请看下面

select
    empnam as Emp_Name,seccod as DEPT,'' as REMARKS
    ,MAX(CASE WHEN STAT = 'IN' THEN clktim END)[IN]
    ,MAX(CASE WHEN STAT = 'OUT' THEN clktim END) OUT
from
    (select a.clkid,
            case when a.devid = '10' then 'IN' else 'OUT' end as STAT
            , a.clkdat, a.clktim, b.empid, b.empnam, b.seccod,
            row_number() over(partition by clkdat order by dateinsert) as seqnum
     from   ClkInf a
            INNER JOIN EmpInf b ON a.clkid = b.clkid
     where  a.clkdat between (select FORMAT(getdate(), 'yyyyMMdd')) 
                         and (select FORMAT(getdate() + 1, 'yyyyMMdd'))
     and    devid in (10, 50)
    ) mak
GROUP BY clkid,clkdat,empnam,seccod
order by DEPT ASC
这导致了下面的图片

如果有机会得到这个结果? 如果有,我需要添加/更改什么查询?谢谢

NAME    DEPT IN OUT
Peter   STP 647 NULL
Jordan  FCW 647 NULL
Mark    EE  724 NULL
Chris   TR  729 NULL
Dray    DC  705 NULL

您必须再添加一个额外的筛选条件:

select * from (
    select
        empnam as Emp_Name,seccod as DEPT,'' as REMARKS
        ,MAX(CASE WHEN STAT = 'IN' THEN clktim END) in_
        ,MAX(CASE WHEN STAT = 'OUT' THEN clktim END) OUT
    from
        (select a.clkid,
                case when a.devid = '10' then 'IN' else 'OUT' end as STAT
                , a.clkdat, a.clktim, b.empid, b.empnam, b.seccod,
                row_number() over(partition by clkdat order by dateinsert) as seqnum
         from   ClkInf a
                INNER JOIN EmpInf b ON a.clkid = b.clkid
         where  a.clkdat between (select FORMAT(getdate(), 'yyyyMMdd')) 
                             and (select FORMAT(getdate() + 1, 'yyyyMMdd'))
         and    devid in (10, 50)
        ) mak
    GROUP BY clkid,clkdat,empnam,seccod
    order by DEPT ASC
) k
where in_ is not null;
您可以添加HAVING子句来检查您的条件输出:IN not null和OUT is null:


您使用的是MySQL还是SQL Server?@Squirrel SQL Server实现预期输出的逻辑是什么?为什么在结果中省略这些行?因为它们的IN值为NULL,所以最好将样本数据用作+。请将您的问题包括在内,包括您当前的尝试和期望的结果。@PhamX.Bach-IFIN=null | | OUT=null OK如果in=null | | OUT!=null将不输出IFIN!=空| |出去=null将不会真正输出?你想不出比KKK更好的尼克了?
select * from (
    select
        empnam as Emp_Name,seccod as DEPT,'' as REMARKS
        ,MAX(CASE WHEN STAT = 'IN' THEN clktim END) in_
        ,MAX(CASE WHEN STAT = 'OUT' THEN clktim END) OUT
    from
        (select a.clkid,
                case when a.devid = '10' then 'IN' else 'OUT' end as STAT
                , a.clkdat, a.clktim, b.empid, b.empnam, b.seccod,
                row_number() over(partition by clkdat order by dateinsert) as seqnum
         from   ClkInf a
                INNER JOIN EmpInf b ON a.clkid = b.clkid
         where  a.clkdat between (select FORMAT(getdate(), 'yyyyMMdd')) 
                             and (select FORMAT(getdate() + 1, 'yyyyMMdd'))
         and    devid in (10, 50)
        ) mak
    GROUP BY clkid,clkdat,empnam,seccod
    order by DEPT ASC
) k
where in_ is not null;
SELECT
    empnam AS Emp_Name,seccod AS DEPT,'' AS REMARKS
    ,MAX(CASE WHEN STAT = 'IN' THEN clktim END)[IN]
    ,MAX(CASE WHEN STAT = 'OUT' THEN clktim END) OUT
FROM
(
    SELECT a.clkid,
            CASE WHEN a.devid = '10' THEN 'IN' ELSE 'OUT' END AS STAT
            , a.clkdat, a.clktim, b.empid, b.empnam, b.seccod,
            ROW_NUMBER() OVER (PARTITION BY clkdat ORDER BY dateinsert) AS seqnum
    FROM   ClkInf a
    INNER JOIN EmpInf b ON a.clkid = b.clkid
    WHERE  a.clkdat BETWEEN (SELECT FORMAT(getdate(), 'yyyyMMdd')) 
                         AND (SELECT FORMAT(getdate() + 1, 'yyyyMMdd'))
        AND    devid IN (10, 50)
) mak
GROUP BY clkid, clkdat, empnam, seccod
HAVING MAX(CASE WHEN STAT = 'IN' THEN clktim END) IS NOT NULL
    AND MAX(CASE WHEN STAT = 'OUT' THEN clktim END) IS NULL
ORDER BY DEPT ASC;