Maybe this would be what you are looking for:
SEL COUNT(*) FROM
(SEL ACCEPTANCE_DATE, 1 AS ORIGIN FROM
MY_DATABASE.HUMAN_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 2 AS ORIGIN FROM
MY_DATABASE.FINANCIAL_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 3 AS ORIGIN FROM
MY_DATABASE.INFRASTRUCTURE_RESOURCES) AS T1
WHERE ACCEPTANCE_DATE='2015-08-09'
GROUP BY ORIGIN;
You could even give the ORIGIN some more meaningful names and show them afterwards:
SEL ORIGIN, COUNT(*) FROM
(SEL ACCEPTANCE_DATE, 'HUMAN' AS ORIGIN FROM
MY_DATABASE.HUMAN_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 'FINANCIAL' AS ORIGIN FROM
MY_DATABASE.FINANCIAL_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 'INFRASTRUCTURE' AS ORIGIN FROM
MY_DATABASE.INFRASTRUCTURE_RESOURCES) AS T1
WHERE ACCEPTANCE_DATE='2015-08-09'
GROUP BY ORIGIN;
Which results in two columns. Now, it still doesn't solve the problem with the third value not being displayed, but this way you know which values are missing and can easily distinguish which should be zeros. If this is not sufficient for you than the code gets nastier. I might think of a solution later.
To address the problem of a missing entry for empty tables I thought of two possible solutions. The choice depends on whether the operation would be performed just once or is this a reoccurring action or just one time event. If you plan to do it multiple times it might be a good idea to create a table with all the origin tables names (or some shortcuts, you'll get the idea) on the database. For this minimal example let's consider such a thing exists under name SOURCE_TABLES:
SELECT RESOURCE FROM SOURCE_TABLES
/*
RESOURCE:
HUMAN
FINANCIAL
INFRASTRUCTURE
*/
In this case the previously provided script needs just a little modification:
SEL ST.RESOURCE, COUNT(T1.ACCEPTANCE_DATE) FROM SOURCE_TABLES ST
LEFT JOIN (SEL ACCEPTANCE_DATE, 'HUMAN' AS ORIGIN FROM
MY_DATABASE.HUMAN_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 'FINANCIAL' AS ORIGIN FROM
MY_DATABASE.FINANCIAL_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 'INFRASTRUCTURE' AS ORIGIN FROM
MY_DATABASE.INFRASTRUCTURE_RESOURCES) AS T1
ON ST.RESOURCE = T1.ORIGIN
WHERE ACCEPTANCE_DATE='2015-08-09'
GROUP BY ST.RESOURCE;
Here, by using LEFT JOIN you ensure that every entry from the table is present in the output, even if in T1 there are no rows with specified origin. COUNT(T1.ACCEPTANCE_DATE) utilises the fact, that NULLs do not add up to the counter.
Now, if for any reason you do not like the idea of creating the table (you can't create an object on database or it is too much of a hassle for a single action) you could stick to the idea of numbers which are easier generated on the fly. The solution below exploits the same idea as above, but is more flexible in terms of the number of tables it reads from and obviously does not require you to create additional table. Considering you mentioned 30 tables, this could be a better option. One can argue that it is less readable though:
WITH numbers AS (
SEL 1 AS number
UNION ALL
SEL number + 1 FROM numbers WHERE number + 1 <= 3 -- Change 3 to the number of sourcing tables
), input_merged AS ( -- if we already use the WITH clause we can do so for merging input. It's more readable
SEL ACCEPTANCE_DATE, 1 AS ORIGIN FROM MY_DATABASE.HUMAN_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 2 AS ORIGIN FROM MY_DATABASE.FINANCIAL_RESOURCES
UNION ALL
SEL ACCEPTANCE_DATE, 3 AS ORIGIN FROM MY_DATABASE.INFRASTRUCTURE_RESOURCES
-- add further sources accordingly...
)
SEL COUNT(ACCEPTANCE_DATE) FROM numbers n
LEFT JOIN input_merged im ON n.number = im.ORIGIN
WHERE ACCEPTANCE_DATE='2015-08-09'
GROUP BY n.number;
This should produce the first asked and desired output.
As for the numbers part in WITH statement you might want to refer to this, note that in this solution I used WITH to also merge input as Christoph did. If you use ORACLE database, utilising CONNECT BY LEVEL could be a better option to create a sequence of numbers.
Hopefully now you can achieve what you desired!