Search code examples
sqlms-accessjoinjet-sql

How to calculate the difference of two SELECTs in SQL (Access, JetSQL)


I need to get the difference of two SUM...WHERE queries from the same table join:

SELECT SUM(Service_template.Service_fee)
FROM (Service_template LEFT JOIN Service ON Service_template.Service_Code = Service.Service_Code) LEFT JOIN Bill ON Service.Service_ID = Bill.Service_ID
WHERE Bill.Service_ID IS NOT NULL

and

SELECT SUM(Service_template.Service_fee)
FROM (Service_template LEFT JOIN Service ON Service_template.Service_Code = Service.Service_Code) LEFT JOIN Bill ON Service.Service_ID = Bill.Service_ID

I've tried using UNION, but it returns two rows, not two columns I can make calculations on.

How do I go about doing it? I feel I am missing something trivial, so thanks in advance!


Solution

  • If you want all three values, you can use conditional aggregation:

    SELECT SUM(IIF(b.Service_ID IS NOT NULL, st.Service_fee, 0)) as total_1,
           SUM(b.Service_Id) as total_2,
           SUM(IIF(b.Service_ID IS NULL, st.Service_fee, 0)) as diff      
    FROM (Service_template as st LEFT JOIN
          Service as s
          ON st.Service_Code = s.Service_Code
         ) LEFT JOIN
         Bill as b
         ON s.Service_ID = b.Service_ID;
    

    If you just want the SUM() where Service_Id is NULL, then:

    SELECT SUM(b.Service_Id) as diff      
    FROM (Service_template as st LEFT JOIN
          Service as s
          ON st.Service_Code = s.Service_Code
         ) LEFT JOIN
         Bill as b
         ON s.Service_ID = b.Service_ID
    WHERE b.Service_ID IS NULL;