WITH Inputs AS
(
    SELECT GroupCode, Reading
    FROM (VALUES
        (CAST('A' AS varchar(1)), CAST(10 AS decimal(10,2))),
        ('A', 20), ('B', 90), ('B', NULL), ('C', NULL)
    ) AS v(GroupCode, Reading)
)
SELECT GroupCode, COUNT(*) AS InputRows, COUNT(Reading) AS PresentValues,
       CAST(SUM(Reading) AS decimal(12,3)) AS GroupTotal,
       CAST(AVG(Reading) AS decimal(12,3)) AS GroupMean
FROM Inputs
GROUP BY GroupCode
ORDER BY GroupCode;

WITH Inputs AS
(
    SELECT GroupCode, Reading
    FROM (VALUES
        (CAST('A' AS varchar(1)), CAST(10 AS decimal(10,2))),
        ('A', 20), ('B', 90), ('B', NULL), ('C', NULL)
    ) AS v(GroupCode, Reading)
), Groups AS
(
    SELECT GroupCode, SUM(Reading) AS GroupTotal,
           COUNT(Reading) AS PresentValues, AVG(Reading) AS GroupMean
    FROM Inputs
    GROUP BY GroupCode
)
SELECT CAST(AVG(GroupMean) AS decimal(12,3)) AS MeanOfGroupMeans,
       CAST(SUM(GroupTotal) / NULLIF(CAST(SUM(PresentValues) AS decimal(12,3)), 0)
            AS decimal(12,3)) AS WeightedMean,
       CAST((SELECT AVG(Reading) FROM Inputs) AS decimal(12,3)) AS DirectMean,
       SUM(PresentValues) AS PresentValues
FROM Groups;

WITH Inputs AS
(
    SELECT GroupCode, Reading
    FROM (VALUES
        (CAST('A' AS varchar(1)), CAST(10 AS decimal(10,2))),
        ('A', 20), ('B', 90), ('B', NULL), ('C', NULL)
    ) AS v(GroupCode, Reading)
)
SELECT COUNT(*) AS InputRows, COUNT(Reading) AS PresentValues,
       CAST(SUM(Reading) / NULLIF(CAST(COUNT(Reading) AS decimal(12,3)), 0)
            AS decimal(12,3)) AS ReconstructedMean,
       CAST(AVG(Reading) AS decimal(12,3)) AS DirectMean
FROM Inputs
WHERE GroupCode = 'C';
