简体   繁体   中英

SQL select using group by

Please help to my query, I have this query(see below)

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

that resulted to image below

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

if the a chance to get this result? if ever what query that i need to add/change? thanks

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

You could add HAVING clause to check your condition output: IN not null and OUT is 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;

You have to add one more extra FILTER condition:

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;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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