Fetch data from different tables on same row

Photograph of a SSD Drive Array

I came across an interesting problem this week. The requirement was to get row counts from two different tables and return these on the same row. The tables had a common column, lets call it category.

The first thought was to use GROUP BY in T-SQL, but there is a problem with this:

SELECT a.Category, COUNT(a.*), b.Category, COUNT(b.*)
FROM TableA a INNER JOIN TableB b ON b.Category = a.Category

The problem with this code is that it gives the cartesian product of A and B, but I would like to know the count of A and the count of B on the same row.

There may well be better ways of doing it, but the way I solved it this time was to use CTE’s (common table expressions). The example T-SQL code using CTE’s would be as follows:

; WITH cte1 (cat, cnt)
AS
(
SELECT a.Category, COUNT(*)
FROM TableA a
), cte2 (cat, cnt)
AS
(
SELECT b.Category, COUNT(*)
FROM TableB b
)
SELECT cte1.cat, cte1.cnt AS CountA, cte2.cnt AS CountB
FROM cte1 INNER JOIN cte2 ON cte2.cat = cte1.cat

My live example was a little more complicated than this but I hope this demonstrates the concept.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *