DECLARE @customertable TABLE (country NVARCHAR(100), col1 BIGINT, col2 BIGINT, col3 BIGINT)
INSERT INTO @customertable
(country, col1, col2, col3)
VALUES
(N'USA', 0, null, 0)
,(N'USA', 0, null, 0)
,(N'USA', null, null, 0)
,(N'USA', 0, 0, null)
, (N'CA', 0, null, 0)
,(N'CA', 0, null, 0)
,(N'CA', null, null, 0)
,(N'CA', 0, 0, null)
;WITH DistinctCountries AS (
SELECT DISTINCT Country
FROM @customertable
)
SELECT Country
, col1/(total*1.0) as [col1pct]
, col2/(total*1.0) as [col2pct]
, col3/(total*1.0) as [col3pct]
FROM DistinctCountries AS DistinctCountries
OUTER APPLY (
SELECT
SUM(CASE WHEN col1 IS NULL THEN 0 ELSE 1 END) col1
,SUM(CASE WHEN col2 IS NULL THEN 0 ELSE 1 END) col2
,SUM(CASE WHEN col3 IS NULL THEN 0 ELSE 1 END) col3
,COUNT(1) as Total
FROM @customertable AS CountApply
WHERE CountApply.Country = DistinctCountries.Country
)MainCount
, если у вас есть уникальный список стран, вероятно, лучше всего это сделать.
, если у вас тонна столбцов, вероятно, лучше всего создать динамический c SQL запрос для автоматического создайте каждый CASE и токенизируйте его .. или .. динамический c сводный запрос.