• Some sample data showing the relationships between the tables would be great. There are a number of ways of structuring this type of query which has different aggregates hanging off key values, which one is best for you will depend on the data. Here's one way which is at least easy to understand, if not the fastest:

    ;WITH CTE_ProductReviews AS (

    SELECT p2p.path_id, p2p.prod_id, o.ReviewCount

    FROM p2p

    INNER JOIN (products) p ON p.prod_id = p2p.prod_id AND p.[status] = 0

    LEFT JOIN (SELECT product_id, COUNT(*) AS ReviewCount

    FROM Reviews

    WHERE [status] = 0

    GROUP BY product_id) o ON o.product_id = p.product_id

    WHERE p2p.[status] = 0)

    SELECT c.name,

    d1.ProductCount AS 'Total products',

    d1.ReviewCount AS 'Total Reviews',

    d2.ProductCount AS 'Prod. With 1 Review'

    FROM c

    INNER JOIN pv ON pv.cat_id = c.cat_id AND pv.step = 1

    INNER JOIN (SELECT path_id,

    COUNT(*) AS ProductCount,

    SUM(ReviewCount) AS ReviewCount

    FROM CTE_ProductReviews

    GROUP BY path_id) d1 ON d1.path_id = pv.path_id

    INNER JOIN (SELECT path_id,

    COUNT(*) AS ProductCount

    FROM CTE_ProductReviews

    WHERE ReviewCount = 1

    GROUP BY path_id) d2 ON d2.path_id = pv.path_id

    WHERE c.[status] = 0

    ORDER BY c.name

    Cheers

    ChrisM

    “Write the query the simplest way. If through testing it becomes clear that the performance is inadequate, consider alternative query forms.” - Gail Shaw

    For fast, accurate and documented assistance in answering your questions, please read this article.
    Understanding and using APPLY, (I) and (II) Paul White
    Hidden RBAR: Triangular Joins / The "Numbers" or "Tally" Table: What it is and how it replaces a loop Jeff Moden