A 2-0 victory over reigning champions France wasn't enough to see Denmark book their spot in next summer's Nations League finals.
For all their possession and such a bright start, France failed to break the deadlock and were punished as the hosts worked their way into the game, deservedly pulling ahead after half an hour and doubling their lead shortly after.
Kasper Hjulmand's side put in a professional display to control the game after the break, dealing with the waves of French pressure and enjoying spells of possession themselves. Croatia being locked in a stalemate with Austria had Denmark top of the group and going through for most of the evening, but it wasn't to be as they bounced back to keep a hold of top spot.
France started at an electric pace and their desperation for an early goal showed, with Kylian Mbappe getting in behind Denmark's backline regularly. For all their intent, though, Kasper Schmeichel showed his class and kept things goalless.
Denmark looked a threat from set-pieces thanks to Eriksen's deliveries and, after surviving France's early, possession-based flurry, brought the game to Didier Deschamps' side. Andreas Skov Olsen came close after 20 minutes, but his touch saw the ball get stuck under his feet in front of goal.
Crucially, the hosts made their pressure count, punishing France by taking the lead after 34 minutes. Eriksen's diagonal ball released Mikkel Damsgaard out wide, who crossed low for Kasper Dolberg to poke in at the near post.
Proceedings quickly went from bad to worse for France as Denmark doubled their lead five minutes later. Eriksen's corners caused France another problem in the box and Olsen fired a half-volley past Alphonse Areola, sending the hosts into half-time with a deserved lead and putting them top of Group 1 as things stood.
Changes at the interval brought France back in charge of possession, and the break did help them to ask more questions of Denmark's defence. Olivier Giroud bought a free-kick in a dangerous area after 51 minutes, but Antoine Griezmann's effort was saved smartly by Schmeichel.
Denmark looked stretched on occasion, but never looked too panicked and were still seeing more than enough of the ball as the game grew on. Schmeichel did bail them out after 67 minutes with a fine stop to deny Mbappe, following a sublime pass behind the defence from Griezmann.
France seemed to run out of steam in the game's closing stages, though, with the substitutes failing to provide any hope of a comeback. Denmark saw things out comfortably to secure second in the group, with Croatia emerging victorious in Austria.
Denmark vs France: Player ratings - UEFA Nations League
1. Denmark (4-3-3)
GK: Kasper Schmeichel (c) - 8/10 - Bailed Denmark out after a slow start with a catalogue of important stops. Down well to deny Griezmann early on in the second half.
RB: Rasmus Kristensen - 6/10 - Didn't add much attacking thrust but kept things tidy and, crucially, kept Mendy very quiet.
CB: Joachim Andersen - 7/10 - Grew into the game as the pressure mounted and occupied France's forward players well.
CB: Andreas Christensen - 7/10 - Key in bringing composure in possession to Denmark's defence. Made the correct passing decisions and was positionally disciplined.
LB: Joakim Maehle - 7/10 - Ought to have scored with the rebound from Olsen's saved shot in the first half. A positive influence from deep.
CM: Thomas Delaney - 7/10 - Combative and composed. His experience showed throughout the evening.
CM: Christian Eriksen - 8/10 - Plays football with his slippers on. His range of pass is a joke. Completely dictated the game in midfield.
CM: Pierre-Emile Hojbjerg - 6/10 - Let his midfield colleagues do the heavy lifting when it came to passing, but an important presence regardless.
RW: Andreas Skov Olsen - 8/10 - What a delight of a footballer Olsen looks to be. Sharp touches and brilliant movement, finished off with an exquisite strike.
ST: Kasper Dolberg - 7/10 - Proper poacher's goal to open the scoring. More of that, please.
LW: Mikkel Damsgaard - 6/10 - Seemed to dip in and out of the game, but also had Pavard's number when in possession.
SUB: Jesper Lindstrom (60' for Damsgaard) - 6/10
SUB: Rasmus Hojlund (60' for Dolberg) - 6/10
SUB: Simon Kjaer (72' for Delaney) - N/A
SUB: Martin Braithwaite (72' for Olsen) - N/A
SUB: Alexander Bah (90' for Kristensen) - N/A
2. France (3-4-1-2)
GK: Alphonse Areola - 6/10 - Made some solid stops, but was clearly troubled by Eriksen's crossing abilities. Not helped by his defenders.
CB: Dayot Upamecano - 5/10 - Lost his bearings when trying to defend for Denmark's opener. Should've dealt with the cross.
CB: William Saliba - 4/10 - For someone so tall and imposing, Saliba should've taken the lead at the back. An underwhelming display.
CB: Benoit Badiashile - 5/10 - Also sub-par on a poor night for France's defence.
RWB: Benjamin Pavard - 6/10 - Went to sleep on occasion when tracking runs from out wide, but tidier after the initial error.
CM: Aurelien Tchouameni - 5/10 - A mediocre display for a typically exciting young talent. Wasn't productive enough in possession.
CM: Eduardo Camavinga - 4/10 - Swallowed up by Denmark's industrious midfield three. Hooked at half-time.
LWB: Ferland Mendy - 5/10 - Wasn't involved enough and made defending too easy for Denmark. Given the run around by Olsen.
AM: Antoine Griezmann (c) - 6/10 - He tried to impose himself and played nice passes when found in space, but simply didn't see the ball enough to be able to really put his stamp on things.
ST: Olivier Giroud - 5/10 - A victim of the aimless, French possession. Marked out of the game, too.
ST: Kylian Mbappe - 6/10 - Bright in patches, but lacked service and - crucially - composure. Got to take his chances with more quality.
SUB: Jonathan Clauss (45' for Saliba) - 6/10
SUB: Youssouf Fofana (45' for Camavinga) - 6/10
SUB: Christopher Nkunku (65' for Giroud) - N/A
SUB: Adrien Truffert (65' for Mendy) - N/A
SUB: Randal Kolo-Muani (81' for Griezmann) - N/A