That about summed up their game on Saturday.
The White Sox eked out a 3-2 victory when ace reliever Jesse Crain shut down the Royals in a shaky eighth inning, and Alejandro De Aza provided his timely sacrifice fly to score pinch-runner Jordan Danks from third base in the top of the ninth.
"We both had the same situation late—had the winning run on third base—and they executed and we didn't," Royals manager Ned Yost said.
It wasn't quite that simple, of course.
Eric Hosmer hit a long fly to right field in the ninth that fell for a triple thanks in part to some miscommunication in the White Sox outfield. But Crain (2-1) calmly got Salvador Perez to pop out and then struck out Lorenzo Cain for his 29th consecutive scoreless appearance.
That kept the game tied going to the ninth inning.
Dayan Viciedo led off with a single against Aaron Crow (3-3), and Jeff Keppinger drew a walk to reach base for the fourth time. Yost brought in closer Greg Holland, and he got pinch-hitter Gordon Beckham to fly out to center field. But that allowed Danks—who was running for Viciedo—to reach third base with one out.
De Aza laid off a couple of pitches out of the zone before ripping a fly ball to right field that was just deep enough to allow Danks to slide home ahead of the throw.
"I was trying to get a pitch that I could make some contact and drive that run in," De Aza said. "The hitters in front me, they all did their job and gave me a chance to drive one in."
Keppinger and Conor Gillaspie also drove in runs for the White Sox, who have taken the first two games in the three-game set after starting 1-6 on their 10-game road trip.
"It seems like we're always on the losing end of one-run games, so fundamentally to get a sac fly to get the winning run, it's a good feeling," Keppinger said. "Hopefully we can build off it."
The Royals, meanwhile, have dropped four straight since climbing back to .500.
"We're all scratching our heads," Yost said. "The consistency of our offense has been a little bit mind-boggling. It's getting them to stay relaxed in situations."
Kansas City (34-38) is 11-33 when scoring three runs or fewer this season.
"It's baseball, man. It's a hard game," the Royals' Mike Moustakas said. "Sometimes you get the job done, sometimes you don't get it done, and that's just kind of how it turns out.
The Royals struck first when Miguel Tejada, starting at second base for the ninth time in his 16-year career, hit a two-out single in the second inning. The 39-year-old then chugged all the way around on a double by Moustakas to give Kansas City the early lead.
It was the first RBI for Moustakas since May 23.
The White Sox threatened in the third when Keppinger singled and Tyler Flowers walked to start the inning. Alex Rios hit a ball down the right-field line that fell foul by just a couple of feet, and then he struck out looking to keep the White Sox off the scoreboard.
At least until the fourth.
Dunn, who was hitting .186 coming into the game, walked leading off the inning. Paul Konerko followed with a single up the middle, and Gillaspie's slow roller up the middle was enough to drive in Dunn with the tying run.
Wade Davis nearly escaped the inning when he got Viciedo to ground into a double play, but Keppinger delivered a single to right that gave the White Sox a 2-1 lead.
Kansas City was poised for a big sixth inning, tying the game on a single by Perez and putting runners on first and second with one out. But reliever Matt Lindstrom entered the game and got Lorenzo Cain to ground into a double play on his first pitch to end the threat.
White Sox starter Jose Quintana wound up going 5 1-3 innings, while Davis made it through seven innings on the warm afternoon. He also gave up two runs for the Royals.
"Tough loss," Davis said, "having a tie game in the ninth inning."
NOTES: Keppinger started at 2B in place of Beckham and finished 3 for 3. ... The Royals activated OF Jarrod Dyson (right high ankle sprain) from the DL and optioned 2B Chris Getz to Triple-A Omaha. ... RHP Dylan Axelrod goes to the mound for the White Sox in Sunday's series finale. RHP James Shields starts for Kansas City.