How can I combine 2 queries?

邮差的信 提交于 2019-12-09 03:58:49

问题


I have these below queries in fastreport. I would like to combine them together into one query. How can I do this ?

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  
ORDER BY 
    EAMEMID

SELECT 
    EAMEMID, COUNT(DISTINCT EAMDATE) ABSENTDAYS        
FROM 
    viewDAILYSUM  
WHERE 
    (EAMEMID = :EAMEMID) 
    AND (EAMDATE BETWEEN :FDate AND :TDate)
    AND (EAMATTNSTATUS IN (6))
GROUP BY 
    EAMEMID
ORDER BY 
    EAMEMID

回答1:


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



回答2:


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



回答3:


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


来源:https://stackoverflow.com/questions/39861013/how-can-i-combine-2-queries

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!