Faits :
A.
A._, né en 1956, a travaillé en qualité de maçon au service de B._ SA depuis 2012. En arrêt de travail dès le mois d'octobre 2015, il a déposé une demande de prestations de l'assurance-invalidité le 8 juin 2016.
Par décision du 9 mai 2019, l'Office de l'assurance-invalidité pour le canton de Vaud (ci-après: l'office AI) a reconnu le droit de l'assuré à une demi-rente d'invalidité depuis le 1 er décembre 2016, fondée sur un degré d'invalidité de 58 %. Ce taux résultait de la comparaison d'un revenu sans invalidité de 68'329 fr. avec un revenu d'invalide de 28'468 fr. 97, en fonction d'une capacité résiduelle de travail de 50 % dans une activité adaptée.
B.
A._ a déféré cette décision au Tribunal cantonal du canton de Vaud, Cour des assurances sociales. Par jugement du 5 mars 2020, la juridiction cantonale a admis le recours et réformé la décision du 9 mai 2019 en ce sens que l'assuré a été mis au bénéfice de trois quarts de rente à compter du 1 er décembre 2016. En bref, elle a fixé le taux d'invalidité de 64 %; celui-ci découlait de la comparaison d'un revenu sans invalidité de 78'058 fr. avec un revenu d'invalide de 28'391 fr.
C.
L'office AI interjette un recours en matière de droit public contre ce jugement dont il demande l'annulation, en concluant à la confirmation de sa décision du 9 mai 2019.
L'intimé conclut au rejet du recours. Il a encore versé au dossier plusieurs certificats médicaux, dans lesquels le docteur C._ a attesté une incapacité de travail de 100 % depuis le 3 juin 2020. L'Office fédéral des assurances sociales a renoncé à se déterminer.

Considérant en droit :
1.
Le recours peut être interjeté pour violation du droit, tel qu'il est délimité par les art. 95 et 96 LTF. Le Tribunal fédéral applique le droit d'office (<ref-law>). Il statue par ailleurs sur la base des faits établis par l'autorité précédente (<ref-law>), sauf s'ils ont été établis de façon manifestement inexacte ou en violation du droit au sens de l'<ref-law> (<ref-law>). Le recourant qui entend s'en écarter doit expliquer de manière circonstanciée en quoi les conditions de l'<ref-law> sont réalisées sinon un état de fait divergent ne peut pas être pris en considération.
2.
Les certificats médicaux produits par l'intimé ont été établis postérieurement au jugement attaqué. Ces pièces sont dès lors irrecevables (<ref-law>).
3.
3.1. Le litige porte sur le taux d'invalidité de l'intimé, dont découle la quotité de la rente d'invalidité. En procédure fédérale, est uniquement contesté le revenu sans invalidité entrant dans la comparaison des revenus au sens de l'<ref-law>.
3.2. Les premiers juges ont exposé de manière complète les règles applicables à la solution du litige (<ref-law>; <ref-law>; <ref-law>), si bien qu'il suffit de renvoyer au jugement attaqué.
4.
4.1. Contrairement à l'office recourant, qui avait déterminé le revenu annuel hypothétique sans invalidité en procédant à une moyenne des revenus inscrits sur le compte individuel AVS durant les années 2013 à 2015, les premiers juges ont établi le revenu sans invalidité en se fondant sur les informations, jugées fiables et concrètes, fournies par l'employeur dans son rapport du 17 août 2016. L'instance précédente a ainsi tenu compte d'un salaire horaire brut de 36 fr. 75, comprenant le salaire de base (29 fr. 20), une indemnité de vacances (3 fr. 80), une indemnité pour jours fériés (0 fr. 92) et la part du treizième salaire de (2 fr. 82), ce salaire brut ayant été versé depuis 2014 pour un horaire hebdomadaire de 40,50 heures. Les premiers juges ont déterminé le revenu annuel à 77'396 fr. (36,75 x 40,5 x 52), puis l'ont actualisé à 78'058 fr. pour l'année 2016 au moyen de l'Indice suisse des salaires nominaux. Ils n'ont pas tenu compte de la rémunération provenant d'une activité accessoire de concierge qui avait procuré à l'intimé 2580 fr. en 2015.
4.2. Le recourant soutient que ce calcul comporte des erreurs manifestes et ne correspond pas aux données indiquées par l'employeur. Singulièrement, il fait valoir que le revenu annuel sans invalidité établi par la juridiction cantonale englobe à tort deux fois les indemnités de vacances et de jours fériés, puisqu'elles sont contenues dans le salaire horaire brut de 36 fr. 75 qui a été extrapolé sur 52 semaines. Par ailleurs, l'horaire hebdomadaire de travail correspondrait à 40,833 heures (en système décimal). Quant au revenu de l'année 2014, il ne devait pas être indexé en 2016, car l'employeur a indiqué le même revenu pour ces années-là. Compte tenu du nombre moyen de 4,35 semaines par mois (365/12/7), le revenu sans invalidité s'élèverait à 67'426 fr. 45 (29 fr. 20 x 40,833 x 4,35 x 13).
4.3. De son côté, l'intimé soutient que l'instance précédente s'est fondée à juste titre sur le questionnaire d'employeur et non sur les revenus inscrits au compte individuel AVS. A ses yeux, le jugement attaqué n'est pas arbitraire du seul fait que la méthode de calcul suivie par les premiers juges ne coïncide pas avec celle du recourant. Il ajoute que si l'horaire hebdomadaire de travail a été pris en compte en sa défaveur (40h30mn au lieu de 40h50mn), le jugement est en revanche conforme au droit en tant que son revenu de 2014 a été indexé aux données de l'année 2016.
5.
5.1. Pour établir le revenu sans invalidité (en l'occurrence en 2016 au moment de la naissance du droit éventuel à la rente d'invalidité: cf. <ref-ruling> consid. 4.3.1 p. 224), il faut se reporter aux éléments du salaire de l'assuré constatés par la juridiction cantonale en fonction des indications fournies par l'employeur le 17 août 2016 et auxquelles les parties se réfèrent à juste titre. Il en ressort que l'intimé, s'il avait continué de travailler au service de B._ SA en 2016, aurait réalisé un salaire horaire brut de 36 fr. 75 comprenant des indemnités pour jours de vacances et jours fériés. Or, lorsque le salaire horaire comprend l'indemnité de vacances et l'indemnité pour jours fériés, les jours correspondants de vacances et de congés doivent être déduits du temps de travail annuel (arrêts 8C_401/2018 du 16 mai 2019 consid. 4.4; 8C_520/2016 du 14 août 2017 consid. 4.3.2 et les références, in SVR 2018 UV n° 4 p. 12; I 446/01 du 4 avril 2002 consid. 2b).
En valeurs arrondies, le supplément de vacances de 3 fr. 80, soit 13 % du salaire de base de 29 fr. 20, équivaut à 6,8 semaines de vacances (52 x 0,13) ou 34 jours par an (6,76 x 5). L'indemnité pour jours fériés de 0 fr. 92, soit 3,15 % du salaire de base de 29 fr. 20, correspond à 1,6 semaines (52 x 0,0315) ou 8 jours fériés par an (1,6 x 5). En 2016, l'intimé aurait ainsi pu travailler 218 jours [ (52 x 5) - (34 + 8)].
Le salaire horaire déterminant est de 33 fr. 92 (29 fr. 20 + 3 fr. 80 + 0 fr. 92). A raison de 8h10mn de travail par jour payées à hauteur 33 fr. 92 fr. par heure, cela correspond à une rémunération annuelle de 60'389 fr. (33 fr. 92 x 8 1/6 x 218), auquel vient s'ajouter 9,7 % au titre du droit au 13e salaire/gratification, soit au total 66'246 fr.
Dans la mesure où il est fondé sur un calcul englobant les indemnités de vacances et de jours fériés, prises en considération pour 52 semaines, le jugement attaqué est donc contraire au droit. En outre, dès lors que les éléments de salaire indiqués par l'employeur étaient valables pour l'année 2016, il n'y avait pas lieu d'indexer le salaire retenu pour cette année-là. En revanche, il n'y a pas lieu de revenir sur le jugement entrepris en ce qui concerne l'activité accessoire de concierge; l'intimé ne conteste pas les constatations des premiers juges à ce sujet.
5.2. En comparant le revenu sans invalidité de 66'246 fr. avec le revenu d'invalide non contesté de 28'391 fr., la perte de gain se monte à 57 % et n'atteint donc pas le seuil ouvrant droit aux trois quarts de rente litigieux (<ref-law> et 28 al. 2 LAI).
Le recours, bien fondé, doit dès lors être admis, le jugement cantonal étant annulé et la décision administrative confirmée en tant qu'elle alloue à l'intimé une demi-rente de l'assurance-invalidité dès le 1er décembre 2016.
6.
L'intimé, qui succombe, supportera les frais de la procédure (<ref-law>).

Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est admis. Le jugement du Tribunal cantonal du canton de Vaud, Cour des assurances sociales, du 5 mars 2020 est annulé. La décision de l'Office de l'assurance-invalidité pour le canton de Vaud du 9 mai 2019 est confirmée.
2.
Les frais de justice, arrêtés à 800 fr., sont mis à la charge de l'intimé.
3.
La cause est renvoyée au Tribunal cantonal du canton de Vaud, Cour des assurances sociales, pour nouvelle décision sur les frais et dépens de la procédure cantonale.
4.
Le présent arrêt est communiqué aux parties, au Tribunal cantonal du canton de Vaud, Cour des assurances sociales, et à l'Office fédéral des assurances sociales.
Lucerne, le 3 décembre 2020
Au nom de la IIe Cour de droit social
du Tribunal fédéral suisse
Le Président : Parrino
Le Greffier : Berthoud