How can I combine 2 queries?

核能气质少年 提交于 2019-12-02 13:08:09

You can use conditional aggregation:

SELECT EAMEMID,
       SUM(CASE WHEN EAMATTNSTATUS in (7, 8) THEN 1 ELSE 0 END) / 2 as ABSENTDAYS1,
       COUNT(DISTINCT CASE WHEN EAMATTNSTATUS in (6) THEN EAMDATE
             END) as ABSENTDAYS  
FROM viewDAILYSUM  
WHERE (EAMEMID = :EAMEMID) AND
      (EAMDATE between :FDate and :TDate)
GROUP BY EAMEMID  
ORDER BY EAMEMID

You can do a join (left because the two select are not the same eamemid) on the dinamyc tables

select t1.EAMEMID, t1.ABSENTDAYS1, t2.ABSENTDAYS 
from (  SELECT EAMEMID , COUNT (EAMATTNSTATUS)/2 as ABSENTDAYS1
      FROM viewDAILYSUM  
      WHERE (EAMEMID = :EAMEMID) 
        and (EAMDATE between :FDate and :TDate)
        and (EAMATTNSTATUS in (7,8))           
      group by EAMEMID  ) t1
left join ( SELECT EAMEMID ,COUNT(DISTINCT EAMDATE) ABSENTDAYS        
FROM viewDAILYSUM  
WHERE (EAMEMID = :EAMEMID) 
  and (EAMDATE between :FDate and :TDate)
  and (EAMATTNSTATUS in (6))                                                             
group by EAMEMID ) t2  on t1.EAMEMID = t2.EAMEMID
ORDER BY  t1.EAMEMID

You can use union same way:

SELECT * FROM
(
  SELECT 
    1 AS NUMQUERY, EAMEMID, COUNT(EAMATTNSTATUS)/2 as ABSENTDAYS
  FROM 
    viewDAILYSUM  
  WHERE 
    (EAMEMID = :EAMEMID) 
    AND (EAMDATE BETWEEN :FDate AND :TDate)
    AND (EAMATTNSTATUS IN (7, 8))           
  GROUP BY 
    EAMEMID

  UNION

  SELECT 
    2, EAMEMID, COUNT(DISTINCT EAMDATE)        
  FROM 
    viewDAILYSUM  
  WHERE 
    (EAMEMID = :EAMEMID) 
    AND (EAMDATE BETWEEN :FDate AND :TDate)
    AND (EAMATTNSTATUS IN (6))
  GROUP BY 
    EAMEMID
)
ORDER BY NUMQUERY, EAMEMID
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!