【问题标题】:How can I combine 2 queries?如何组合 2 个查询?
【发布时间】:2016-10-04 20:16:13
【问题描述】:

我在 fastreport 中有以下这些查询。我想将它们组合成一个查询。我该怎么做?

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

【问题讨论】:

    标签: sql fastreport


    【解决方案1】:

    您可以使用条件聚合:

    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 个查询的输出?我可以这样做吗?
    • @majed 。 . .如果您需要对这些值求和,只需在select 中的表达式之间使用+
    【解决方案2】:

    你可以同样的方式使用union

    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
    

    【讨论】:

      【解决方案3】:

      您可以在动态表上进行连接(左,因为两个选择不是同一个 eamemid)

      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
      

      【讨论】:

        猜你喜欢
        • 2017-06-15
        • 2016-06-17
        • 1970-01-01
        • 2018-08-02
        • 1970-01-01
        • 2020-10-01
        • 2021-05-21
        • 2023-02-08
        • 1970-01-01
        相关资源
        最近更新 更多