Reputation: 139
Table 1 Table 2
Class | VAL Class | VAL
------|----- ------|-----
A | 1 A | 1
A | 1 A | 1
A | 1 A | 1
B | 1 B | 1
A | 1
B | 1
C | 1
If I have two tables as above and I need the result as the following table Result needed:
Class | T1 | T2
------|-----|-----
A | 4 | 3
B | 2 | 1
C | 1 | 0
I'm trying this query but it's not working.
SELECT [Class],COUNT(VAL) FROM dbo.T1 group by [Class])
UNION
SELECT [Class],COUNT(VAL) FROM dbo.T2 group by [Class])
Upvotes: 1
Views: 886
Reputation: 74
SELECT t1.class,
COUNT(t1.class) AS T1,
X.T2Count AS T2
FROM @table1 t1
OUTER APPLY(
SELECT COUNT(val) AS T2Count
FROM @table2 t2
WHERE t2.class = t1.class
)X
GROUP BY t1.class,X.T2Count
ORDER BY t1.class
Upvotes: 1
Reputation: 3127
SELECT COALESCE(a.Class, b.Class) AS [Class], COALESCE(a.T1,0) AS T1, COALESCE(b.T2,0) AS T2
FROM
(SELECT [Class],COUNT(VAL) AS T1 FROM dbo.T1 GROUP BY [Class]) a
FULL OUTER JOIN
(SELECT [Class],COUNT(VAL) AS T2 FROM dbo.T2 GROUP BY [Class]) b
ON a.Class = b.Class
Another possible solution
SELECT
a.[Class]
, COUNT(a.VAL1) AS T1
, COUNT(a.VAL2) AS T2
FROM (
SELECT [Class], VAL AS VAL1, NULL AS VAL2 FROM dbo.T1
UNION ALL
SELECT [Class], NULL AS VAL1, VAL AS VAL2 FROM dbo.T2
) a
GROUP BY
a.Class;
Upvotes: 3
Reputation: 155
Select Class, sum(T1) as T1, sum(T2) AS T2
From
(
Select Class, VAL AS T1, 0 as T2
From Table1
Union All
Select Class, 0 as T1, VAL AS T2
From Table2
) A
group by A.Class
Upvotes: 1
Reputation: 12014
And another approach here
declare @table1 table (class varchar(1) null, val int)
declare @table2 table (class varchar(1) null, val int)
insert into @table1 values ('A', 1)
insert into @table1 values ('A', 1)
insert into @table1 values ('A', 1)
insert into @table1 values ('B', 1)
insert into @table1 values ('A', 1)
insert into @table1 values ('B', 1)
insert into @table1 values ('C', 1)
insert into @table2 values ('A', 1)
insert into @table2 values ('A', 1)
insert into @table2 values ('A', 1)
insert into @table2 values ('B', 1)
select t.Class,
(select count(val) from @table1 where class = t.class),
(select count(val) from @table2 where class = t.class)
from ( select class
from @table1 t1
union
select class
from @table2 t1
) t
this returns
Class T1 T2
A 4 3
B 2 1
C 1 0
Upvotes: 1