获取按值分组的 Sum 和 Percent WHERE 数据的查询

Get query with Sum and Percent WHERE data grouped by value

这是我的 table:

Type Creature Population
HP Universe Witches/Wizards 100,000
HP Universe Muggles 250,000
HP Universe Others 75,000
Other Universe Witches/Wizards 500,000
Other Universe Muggles 1,000,000
Other Universe Others 175

我用这个查询得到了我的 table:

SELECT 
CASE WHEN type LIKE '%hp%' THEN 'HP Universe'
ELSE 'Other Universe' 
END AS Type, 
CASE WHEN creature LIKE '%witches%' THEN 'Witches/Wizards'
WHEN creature LIKE '%muggle%' THEN 'Muggles'
ELSE 'Others' 
END AS Creature,
COUNT(DISTINCT type_id) AS Population
FROM `table`
WHERE date BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH) AND CURRENT_DATE()
GROUP BY 1, 2
ORDER BY 1 DESC

我想添加另一个名为 pct_population 的列,总计 population type,然后给我百分比 creature

基本上,我希望我的 table 看起来像这样:

Type Creature Population Pct_Population
HP Universe Witches/Wizards 100,000 23.5%
HP Universe Muggles 250,000 58.82%
HP Universe Others 75,000 17.68%
Other Universe Witches/Wizards 500,000 33.32%
Other Universe Muggles 1,000,000 66.65%
Other Universe Others 175 0.01%

我们基本上是将每个 typepopulation 相加,然后按 creature.

细分百分比

我不确定如何将其添加到我的查询中。

您可以受益于 window function:

SELECT 
    CASE WHEN type LIKE '%hp%' THEN 'HP Universe'
    ELSE 'Other Universe' 
    END AS Type 
    , CASE WHEN creature LIKE '%witches%' THEN 'Witches/Wizards'
    WHEN creature LIKE '%muggle%' THEN 'Muggles'
    ELSE 'Others' 
    END AS Creature
    , COUNT(DISTINCT type_id) AS Population
    , COUNT(DISTINCT type_id) / count(*) over (partition by CASE WHEN creature LIKE '%witches%' THEN 'Witches/Wizards'  WHEN creature LIKE '%muggle%' THEN 'Muggles' ELSE 'Others' END AS Creature)* 100.0 AS Pct_Population
FROM `table`
WHERE date BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH) AND CURRENT_DATE()
GROUP BY 1, 2
ORDER BY 1 DESC