使用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;