• Another old habit to break if you are using SQL2008 or greater is to avoid GROUP BY when all you really need is an aggregated column value.

    SELECT

    A.Portfolio

    ,B.PortfolioID

    ,SUM(B.MarketValue) AS SumOfMV

    ,COUNT(B.SecID) AS [# of Securities]

    FROM

    ERTutAccounts A

    INNER JOIN ERTutPositions B

    ON A.PortfolioID = B.PortfolioID

    GROUP BY

    ERTutAccounts.Portfolio

    ,ERTutPositions.PortfolioID;

    SELECT

    A.Portfolio

    ,B.PortfolioID

    ,SUM(B.MarketValue) OVER (PARTITION BY A.Portfolio, B.PortfolioID) AS SumOfMV

    ,COUNT(B.SecID) OVER (PARTITION BY A.Portfolio, B.PortfolioID) AS [# of Securities]

    FROM

    ERTutAccounts A

    INNER JOIN ERTutPositions B

    ON A.PortfolioID = B.PortfolioID

    You can still use GROUP BY of course if you need to group the portfolios themselves but just to do sums or counts (or min or max, etc) the OVER() clause makes things a lot easier.