【问题标题】:sum of count of column for group by two columns mysql按两列mysql分组的列计数总和
【发布时间】:2011-10-12 10:49:39
【问题描述】:
INSERT INTO tablex(Id, Name, Team, Joined) VALUES

(1, 'Mr. A', 'X', '2011-02-22'),

(2, 'Mr. B', 'Y', '2011-02-11'),

(3, 'Ms. C', 'X', '2011-02-10'),

(4, 'Mr. D', 'Y', '2011-01-12'),

(5, 'Ms. E', 'X', '2011-01-06'),

(6, 'Mr. F', 'Y', '2011-05-02');

(7, 'Mr. H', 'X', '2011-02-01');

需要的输出是:

Month   | Team | TotalMembers | Percentage

 01/2011  | X    |   1          |   50

 01/2011  | Y    |   1          |   50

 02/2011  | X    |   2          |   75

 02/2011  | Y    |   1          |   25

 05/2011  | X    |   0          |   0

 05/2011  | Y    |   1          |   100

请帮我完成上述工作。在 MySQL 中最受青睐(GROUP BY Team, DATE_FORMAT(Joined, '%m/%Y'))。但可以使用PHP。

提前致谢

【问题讨论】:

  • 您能解释一下百分比列吗?如果是,就像我想的那样,加入一个团队的成员与当月加入的所有成员的比率,那么第 3 行和第 4 行不正确,应该保持 66.6 和 33.3 吗?
  • X队5月11日需要0记录吗?如果您有另一个团队,比如 Z 团队,那不会导致输出中出现大量 0 记录吗?

标签: mysql count group-by sum


【解决方案1】:

可以有更优雅的解决方案,但这个应该可行:

SELECT DATE_FORMAT( Joined, '%m/%Y' ) AS
    MONTH , team, (
    count( id ) / (
    SELECT count( * )
    FROM tablex
    WHERE DATE_FORMAT( Joined, '%m/%Y' ) = DATE_FORMAT( tx.Joined, '%m/%Y' )
    GROUP BY DATE_FORMAT( Joined, '%m/%Y' ) ) *100
    ) AS percentage
    FROM `tablex` AS tx
    GROUP BY DATE_FORMAT( Joined, '%m/%Y' ) , team

【讨论】:

  • +1 很好的答案!一个小问题——它不包括 5/11 记录的 X 有 0 个团队成员:sqlize.com/164lD5bwbw
  • 但是如果你在 06/11 有一个团队 Z,你会得到很多 X 和 Y 都是 0 的记录吗?如果你想要这样,你正在寻找一个完全不同的解决方案。首先检索所有可能的团队,然后查询所有月份的数据库。然后每个月计算成员总数和百分比,并为不存在的团队添加 0。您可能可以在一个查询中完成,但性能将是一场灾难
  • 我同意你的看法。我只是注意到您的解决方案与 OP 作为“必需输出”发布的内容之间存在差异。我会用 OP 来解决这个问题。
  • 谢谢宁!这非常有用。在此之后,我发布了其他查询,请查看此链接。 link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 2015-05-18
  • 2020-02-10
相关资源
最近更新 更多