Tenho uma tabela no SQL Server chamada df encontrada aqui :
-- Parameters
DECLARE @Year INT = 2020; --, @Country varchar(50)= 'Brazil';
WITH ModeData AS (
SELECT country,
a.Mode
FROM df
CROSS APPLY (
SELECT TOP 1 Mode, COUNT(*) AS cnt
FROM (VALUES (val1), (val2), (val3)) AS t(Mode)
GROUP BY Mode
ORDER BY COUNT(*) DESC
) a
where year=@year --and country=@country
)
-- Calculate proportions and map modes to labels
, Proportions AS (
SELECT country,
CASE
WHEN Mode = 1 THEN 'Very Dissatisfied'
WHEN Mode = 2 THEN 'Dissatisfied'
WHEN Mode = 3 THEN 'Neutral'
WHEN Mode = 4 THEN 'Satisfied'
WHEN Mode = 5 THEN 'Very Satisfied'
END AS SatisfactionLevel,
COUNT(*) * 1.0 / SUM(COUNT(*)) OVER (PARTITION BY country) AS Proportion
FROM ModeData
GROUP BY country, Mode
)
-- Pivot the results to get each satisfaction level as a column
SELECT country,
[Very Dissatisfied],
[Dissatisfied],
[Neutral],
[Satisfied],
[Very Satisfied]
FROM Proportions
PIVOT (
MAX(Proportion)
FOR SatisfactionLevel IN ([Very Dissatisfied], [Dissatisfied], [Neutral], [Satisfied], [Very Satisfied])
) AS p
ORDER BY country;
A tabela resultante é:
País | Muito insatisfeito | Insatisfeito | Neutro | Satisfeito | Muito satisfeito |
---|---|---|---|---|---|
Brasil | 0,285714285714 | 0,142857142857 | 0,142857142857 | 0,142857142857 | 0,285714285714 |
Canadá | 0,1111111111111 | 0,1111111111111 | 0,333333333333 | 0,222222222222 | 0,222222222222 |
França | 0,250000000000 | 0,125000000000 | 0,250000000000 | 0,250000000000 | 0,125000000000 |
Itália | 0,166666666666 | 0,166666666666 | 0,166666666666 | 0,166666666666 | 0,333333333333 |
EUA | 0,222222222222 | 0,1111111111111 | 0,1111111111111 | 0,333333333333 | 0,222222222222 |
Quero calcular a contagem de cada país. Quantas linhas tem cada país na tabela df e adicionar essa contagem como uma coluna extra na tabela resultante. Idealmente e com base nos dados do exemplo de brinquedo, o resultado que quero que pareça:
País | Muito insatisfeito | Insatisfeito | Neutro | Satisfeito | Muito satisfeito | Contar |
---|---|---|---|---|---|---|
Brasil | 0,285714285714 | 0,142857142857 | 0,142857142857 | 0,142857142857 | 0,285714285714 | 7 |
Canadá | 0,1111111111111 | 0,1111111111111 | 0,333333333333 | 0,222222222222 | 0,222222222222 | 9 |
França | 0,250000000000 | 0,125000000000 | 0,250000000000 | 0,250000000000 | 0,125000000000 | 8 |
Itália | 0,166666666666 | 0,166666666666 | 0,166666666666 | 0,166666666666 | 0,333333333333 | 6 |
EUA | 0,222222222222 | 0,1111111111111 | 0,1111111111111 | 0,333333333333 | 0,222222222222 | 9 |
Você está complicando demais. Em vez de calcular cada um
SatisfactionLevel
como um grupo separado e depois ter que pivotar de volta, use apenas agregação condicional.db<>violino