【问题标题】:Getting the yearly income percentage for the top(100) Male and Female Seperated in 2 columns using AdventureWorksDW2016 table使用 AdventureWorksDW2016 表获取前 (100) 名男性和女性的年收入百分比,分为 2 列
【发布时间】:2022-01-03 22:01:51
【问题描述】:

我正在尝试从 dbo.DimCustomer 获取最高 (100) 年收入 (YearlyIncome) 的百分比,并且我想要显示男性和女性年收入百分比的 2 列“%M”和“%F”

这是我的代码:

Select Top(100) 
  Case dbo.DimCustomer.Gender 
    When 'M' Then (Count(dbo.DimCustomer.Gender)*100)/sum(YearlyIncome)
  End as '%M',
  Case dbo.DimCustomer.Gender 
    When 'F' Then (Count(dbo.DimCustomer.Gender)*100)/sum(YearlyIncome)
  End as '%F'
From 
  dbo.DimCustomer
Group By 
  Gender

这是我得到的结果。我做得对吗?

我可以在没有Null 的情况下显示它们吗?只有 2 列并排,1 行是百分比?

【问题讨论】:

  • 示例数据和预期结果很好地补充了 SQL 问题,最好是 Minimal, Reproducible Example
  • 平均值是除以条目数,而不是相乘。
  • 前 100 名按什么排序?你没有ORDER BY。此外,TOP 100 将在分组后计算,因此仅在您有 100 种性别时才有效,我认为我们还没有完成
  • @Charlieface 我不认为我需要它,因为我应该只有 2 列和 1 行吧?
  • 好吧,如果你想要前 100 个 of 的东西,你需要定义:你想要的顶部是什么,顶部的实际含义是什么,顶部是什么,底部是什么.否则你会得到任意行

标签: sql sql-server


【解决方案1】:

要将它们放入同一行,您可以使用条件聚合。

SELECT
  MalePct   = SUM(CASE WHEN c.Gender = 'M' THEN c.YearlyIncome END) * 100.0 / SUM(c.YearlyIncome),
  FemalePct = SUM(CASE WHEN c.Gender = 'F' THEN c.YearlyIncome END) * 100.0 / SUM(c.YearlyIncome)
FROM (
    SELECT TOP (100)
      c.YearlyIncome,
      c.Gender
    FROM dbo.DimCustomer c
    ORDER BY c.YearlyIncome DESC
) c;

【讨论】:

  • 非常感谢您迄今为止的帮助,但我在 case 后的第二行和第三行收到错误“无效的列名 'Gender'”
  • 更改内部查询以包含Gender
  • 确实,谢谢。
  • @Kirito 现在应该修复了。缺乏样本数据意味着难以测试
  • 这正是我想要的,非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
相关资源
最近更新 更多