Against Thomas Hatch (1-1), automatic runner Mike Tauchman went to third on Nico Hoerner's groundout. Dansby Swanson walked and went to second on a wild pitch. Happ then singled to right, where Connor Joe misplayed the ball, allowing both runners to score.
The Pirates got one back in the bottom of the 10th on Joe's sacrifice fly before Adbert Alzolay got Joshua Palacios to fly out to end the game.
Cody Bellinger and Nico Hoerner each added an RBI single and Jeimer Candelario had an RBI sacrifice fly for the Cubs, who have won five of six.
Chicago starter Justin Steele pitched six innings, giving up three runs (two earned) and six hits, with six strikeouts and two walks.
Daniel Palencia (4-0) pitched a scoreless ninth. Alzolay earned his 20th save.
Palacios hit a two-run home run and Ji Hwan Bae added an RBI single for the Pirates, who have lost two straight.
Pittsburgh starter Rob Zastryzny, working as an opener, pitched one inning, allowing one run and two hits, with one strikeout. Andre Jackson then handled the bulk of the work, pitching the next six innings and yielding two runs on six hits with two strikeouts.
Hoerner led off the game with a double to right-center. Two outs later, he scored on Bellinger's base hit to left for a 1-0 Chicago lead.
In the Cubs' second, Seiya Suzuki doubled off the wall in right and went to third on Yan Gomes' single to right. Suzuki scored on Candelario's fielder's choice to left to increase the lead to 2-0.
Gomes advanced to third via Nick Madrigal's single and Tauchman's fielder's choice grounder. Hoerner then singled to right to drive in Gomes for a 3-0 edge.
Endy Rodriguez walked to lead off the bottom of the second. Vinny Capra reached when Steele misplayed his sacrifice bunt, with Rodriguez going to second. Two strikeouts later, Rodriguez scored on Bae's single up the middle to cut it to 3-1.
Joe singled to left in the third before Palacios hit his sixth homer, a shot to right that bounced into the Allegheny River. That tied it 3-3.
—Field Level Media