Сначала необходимо сгенерировать список дат, а затем вернуться к нему для каждого счетчика.
Это устранит проблемы с различным количеством строк для каждого агрегата
SELECT
base.TheDate AS OrdDare,
ISNULL(T1.C1, 0) AS col1,
ISNULL(T2.C2, 0) AS col2,
ISNULL(T3.C3, 0) AS col3,
ISNULL(T4.C4, 0) AS col4
FROM
( -- UNION will also DISTINCT
SELECT CONVERT(date,created_date,101) AS TheDate FROM table1
WHERE created_date BETWEEN @fromdate and @todate
UNION
SELECT CONVERT(date,created_date,101) FROM table2
WHERE created_date BETWEEN @fromdate and @todate
) base
LEFT JOIN
(
SELECT CONVERT(date,created_date,101) AS TheDate, COUNT(distinct cust_id) AS C1
FROM table1
WHERE created_date BETWEEN @fromdate and @todate
GROUP BY CONVERT(date,created_date,101)
) T1 ON base.TheDate = T1.TheDate
LEFT JOIN
(
SELECT CONVERT(date,created_date,101) AS TheDate, COUNT(distinct cust_id) AS C2
FROM table1
WHERE WHERE [status] LIKE 'P%' and created_date BETWEEN @fromdate and @todate
GROUP BY CONVERT(date,created_date,101)
) T2 ON base.TheDate = T2.TheDate
LEFT JOIN
(
SELECT CONVERT(date,created_date,101) AS TheDate, COUNT(distinct cust_id) AS C3
FROM table2
WHERE created_date BETWEEN @fromdate and @todate
GROUP BY CONVERT(date,created_date,101)
) T3 ON base.TheDate = T3.TheDate
LEFT JOIN
(
SELECT CONVERT(date,created_date,101) AS TheDate, COUNT(distinct cust_id) AS C4
FROM table2
WHERE created_date BETWEEN @fromdate and @todate and result_error like 'FAIL%'
GROUP BY CONVERT(date,created_date,101)
) T4 ON base.TheDate = T4.TheDate
ORDER BY
base.TheDate;