Labour cost levels by NACE Rev. 2 activity

Data - Eurostat

Info

Last observation: Annual: 2025 (N = 10,286)

First observation: Annual: 2008 (N = 6,080)

Last data update: 23 jul 2026, 22:14. Last compile: 24 jul 2026, 02:10

Structure

Individual countries

France

2020

Code
lc_lci_lev %>%
  filter(time == "2020",
         unit == "EUR",
         geo %in% c("FR"),
         lcstruct != "D2-D4_MD5_RAT") %>%
  
  select(Lcstruct, nace_r2, values) %>%
  
  spread(Lcstruct, values) %>%
  arrange(-`Labour cost for LCI (compensation of employees plus taxes minus subsidies)`) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

2019

Code
lc_lci_lev %>%
  filter(time == "2019",
         unit == "EUR",
         geo %in% c("FR"),
         lcstruct != "D2-D4_MD5_RAT") %>%
  
  select(Lcstruct, nace_r2, values) %>%
  
  spread(Lcstruct, values) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

Germany

2020

Code
lc_lci_lev %>%
  filter(time == "2020",
         unit == "EUR",
         geo %in% c("DE"),
         lcstruct != "D2-D4_MD5_RAT") %>%
  
  select(Lcstruct, nace_r2, values) %>%
  
  spread(Lcstruct, values) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

2019

Code
lc_lci_lev %>%
  filter(time == "2019",
         unit == "EUR",
         geo %in% c("DE"),
         lcstruct != "D2-D4_MD5_RAT") %>%
  
  select(Lcstruct, nace_r2, values) %>%
  
  spread(Lcstruct, values) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

France VS Germany

B-E - Industry (except construction)

France, Germany

All

Code
load_data("eurostat/nace_r2_fr.RData")
lc_lci_lev %>%
  filter(geo %in% c("FR", "DE"),
         # SCPOLDPEN: Old age pension
         lcstruct == "D1_D4_MD5",
         # TOTAL: Total
         nace_r2 %in% c("B-E", "B-N", "C"),
         unit == "EUR") %>%
  year_to_date %>%
  
  
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + geom_line(aes(x = date, y = values, color = color, linetype = Nace_r2)) +
  xlab("") + ylab("Coût horaire du travail") + add_4flags + scale_color_identity() +
  scale_linetype_manual(values = c("dashed", "solid", "dotted")) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 1), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.2, 0.8),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = seq(0, 60, 1),
                     labels = scales::dollar_format(su = "€", p = ""))

2009-

Code
load_data("eurostat/nace_r2_fr.RData")
lc_lci_lev %>%
  filter(geo %in% c("FR", "DE"),
         # SCPOLDPEN: Old age pension
         lcstruct == "D1_D4_MD5",
         # TOTAL: Total
         nace_r2 %in% c("C", "B-N"),
         unit == "EUR") %>%
  year_to_date %>%
  filter(date >= as.Date("2008-01-01")) %>%
  
  
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + geom_line(aes(x = date, y = values, color = color, linetype = Nace_r2)) +
  xlab("") + ylab("Coût horaire du travail") + add_4flags + scale_color_identity() +
  scale_linetype_manual(values = c("dashed", "solid")) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 1), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.2, 0.8),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = seq(0, 60, 1),
                     labels = scales::dollar_format(su = "€", p = ""))

D1_D4_MD5 - Labour cost for LCI (compensation of employees plus taxes minus subsidies)

France, Germany, Italy, Spain

Code
lc_lci_lev %>%
  filter(lcstruct == "D1_D4_MD5",
         time == "2019",
         unit == "EUR",
         geo %in% c("FR", "DE", "IT", "ES")) %>%
  
  mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
  mutate(Geo = gsub(" ", "-", str_to_lower(Geo)),
         Geo = paste0('<img src="../../bib/flags/vsmall/', Geo, '.png" alt="Flag">')) %>%
  select(nace_r2, Geo, values) %>%
  
  spread(Geo, values) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

B - Mining

Code
lc_lci_lev %>%
  filter(geo %in% c("FR", "DE", "IT"),
         # SCPOLDPEN: Old age pension
         lcstruct == "D1_D4_MD5",
         # TOTAL: Total
         nace_r2 == "B",
         unit == "EUR") %>%
  year_to_date %>%
  
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + geom_line(aes(x = date, y = values, color = color)) +
  xlab("") + ylab("Hourly wages + taxes - subsidies (Industry)") + add_3flags + scale_color_identity() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_continuous(breaks = seq(0, 60, 1),
                     labels = scales::dollar_format(su = "€", p = ""))

B-E - Industry (except construction)

France, Italy, Spain

Code
lc_lci_lev %>%
  filter(geo %in% c("FR", "ES", "IT"),
         # SCPOLDPEN: Old age pension
         lcstruct == "D1_D4_MD5",
         # TOTAL: Total
         nace_r2 == "B-E",
         unit == "EUR") %>%
  year_to_date %>%
  
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + geom_line(aes(x = date, y = values, color = color)) +
  xlab("") + ylab("Hourly wages + taxes - subsidies (Industry)") + add_3flags + scale_color_identity() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_continuous(breaks = seq(0, 60, 1),
                     labels = scales::dollar_format(su = "€", p = ""))

France, Germany, Italy

Code
lc_lci_lev %>%
  filter(geo %in% c("FR", "DE", "IT"),
         # SCPOLDPEN: Old age pension
         lcstruct == "D1_D4_MD5",
         # TOTAL: Total
         nace_r2 == "B-E",
         unit == "EUR") %>%
  year_to_date %>%
  
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + geom_line(aes(x = date, y = values, color = color)) +
  xlab("") + ylab("Hourly wages + taxes - subsidies (Industry)") + add_3flags + scale_color_identity() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_continuous(breaks = seq(0, 60, 1),
                     labels = scales::dollar_format(su = "€", p = ""))

Greece, Portugal, Spain

Code
lc_lci_lev %>%
  filter(geo %in% c("EL", "PT", "ES"),
         # SCPOLDPEN: Old age pension
         lcstruct == "D1_D4_MD5",
         # TOTAL: Total
         nace_r2 == "B-E",
         unit == "EUR") %>%
  year_to_date %>%
  
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + geom_line(aes(x = date, y = values, color = color)) +
  xlab("") + ylab("Hourly wages + taxes - subsidies (Industry)") + add_3flags + scale_color_identity() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_continuous(breaks = seq(0, 60, 1),
                     labels = scales::dollar_format(su = "€", p = ""))

C - Manufacturing

Code
lc_lci_lev %>%
  filter(geo %in% c("FR", "DE", "IT"),
         # SCPOLDPEN: Old age pension
         lcstruct == "D1_D4_MD5",
         # TOTAL: Total
         nace_r2 == "C",
         unit == "EUR") %>%
  year_to_date %>%
  
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + geom_line(aes(x = date, y = values, color = color)) +
  xlab("") + ylab("Hourly wages + taxes - subsidies (Manufacturing)") + add_3flags + scale_color_identity() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_continuous(breaks = seq(0, 60, 1),
                     labels = scales::dollar_format(su = "€", p = ""))

D11 - Wages and salaries (total)

France, Germany, Italy, Spain

Code
lc_lci_lev %>%
  filter(lcstruct == "D11",
         time == "2019",
         unit == "EUR",
         geo %in% c("FR", "DE", "IT", "ES")) %>%
  
  mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
  mutate(Geo = gsub(" ", "-", str_to_lower(Geo)),
         Geo = paste0('<img src="../../bib/flags/vsmall/', Geo, '.png" alt="Flag">')) %>%
  select(nace_r2, Geo, values) %>%
  
  spread(Geo, values) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

Greece, Portugal, Spain

Code
lc_lci_lev %>%
  filter(lcstruct == "D11",
         time == "2019",
         unit == "EUR",
         geo %in% c("EL", "ES", "PT")) %>%
  
  mutate(Geo = gsub(" ", "-", str_to_lower(Geo)),
         Geo = paste0('<img src="../../bib/flags/vsmall/', Geo, '.png" alt="Flag">')) %>%
  select(nace_r2, Geo, values) %>%
  
  spread(Geo, values) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

B-N - Business economy

France, Germany, Italy

Code
lc_lci_lev %>%
  filter(geo %in% c("FR", "DE", "IT"),
         # SCPOLDPEN: Old age pension
         lcstruct == "D11",
         # TOTAL: Total
         nace_r2 == "B-N",
         unit == "EUR") %>%
  year_to_date %>%
  
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + geom_line(aes(x = date, y = values, color = color)) +
  xlab("") + ylab("Hourly Wage") + add_3flags + scale_color_identity() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_continuous(breaks = seq(0, 60, 1),
                     labels = scales::dollar_format(su = "€", p = ""))

Greece, Portugal, Spain

Code
lc_lci_lev %>%
  filter(geo %in% c("EL", "ES", "PT"),
         # SCPOLDPEN: Old age pension
         lcstruct == "D11",
         # TOTAL: Total
         nace_r2 == "B-N",
         unit == "EUR") %>%
  year_to_date %>%
  
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + geom_line(aes(x = date, y = values, color = color)) +
  xlab("") + ylab("Hourly Wage") + add_3flags + scale_color_identity() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_continuous(breaks = seq(0, 60, 1),
                     labels = scales::dollar_format(su = "€", p = ""))

B - Mining

Code
lc_lci_lev %>%
  filter(geo %in% c("FR", "DE", "IT"),
         # SCPOLDPEN: Old age pension
         lcstruct == "D11",
         # TOTAL: Total
         nace_r2 == "B",
         unit == "EUR") %>%
  year_to_date %>%
  
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + geom_line(aes(x = date, y = values, color = color)) +
  xlab("") + ylab("Hourly Wage") + add_3flags + scale_color_identity() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_continuous(breaks = seq(0, 60, 1),
                     labels = scales::dollar_format(su = "€", p = ""))

B-E - Industry (except construction)

English

Code
lc_lci_lev %>%
  filter(geo %in% c("FR", "DE", "IT"),
         # SCPOLDPEN: Old age pension
         lcstruct == "D11",
         # TOTAL: Total
         nace_r2 == "B-E",
         unit == "EUR") %>%
  year_to_date %>%
  
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + geom_line(aes(x = date, y = values, color = color)) +
  xlab("") + ylab("Hourly Wage") + add_3flags + scale_color_identity() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_continuous(breaks = seq(0, 60, 1),
                     labels = scales::dollar_format(su = "€", p = ""))

French

Code
lc_lci_lev %>%
  filter(geo %in% c("FR", "DE", "IT"),
         # SCPOLDPEN: Old age pension
         lcstruct == "D11",
         # TOTAL: Total
         nace_r2 == "B-E",
         unit == "EUR") %>%
  year_to_date %>%
  
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + geom_line(aes(x = date, y = values, color = color)) +
  xlab("") + ylab("Hourly Wage") + add_3flags + scale_color_identity() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_continuous(breaks = seq(0, 60, 1),
                     labels = scales::dollar_format(su = "€", p = ""))

C - Manufacturing

English

Code
lc_lci_lev %>%
  filter(geo %in% c("FR", "DE", "IT"),
         # SCPOLDPEN: Old age pension
         lcstruct == "D11",
         # TOTAL: Total
         nace_r2 == "C",
         unit == "EUR") %>%
  year_to_date %>%
  
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + geom_line(aes(x = date, y = values, color = color)) +
  xlab("") + ylab("Hourly Wage") + add_3flags + scale_color_identity() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_continuous(breaks = seq(0, 60, 1),
                     labels = scales::dollar_format(su = "€", p = ""))

French

Code
lc_lci_lev %>%
  filter(geo %in% c("FR", "DE", "IT"),
         # SCPOLDPEN: Old age pension
         lcstruct == "D11",
         # TOTAL: Total
         nace_r2 == "C",
         unit == "EUR") %>%
  year_to_date %>%
  
  left_join(colors, by = c("Geo" = "country")) %>%
  ggplot + theme_minimal() + geom_line(aes(x = date, y = values, color = color)) +
  xlab("") + ylab("Salaire Horaire") + add_3flags + scale_color_identity() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_continuous(breaks = seq(0, 60, 1),
                     labels = scales::dollar_format(su = "€", p = ""))

D12_D4_MD5 - Labour Costs Other than Wages and Salaries

France, Germany, Italy, Spain

Code
lc_lci_lev %>%
  filter(lcstruct == "D12_D4_MD5",
         time == "2019",
         unit == "EUR",
         geo %in% c("FR", "DE", "IT", "ES")) %>%
  
  mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
  mutate(Geo = gsub(" ", "-", str_to_lower(Geo)),
         Geo = paste0('<img src="../../bib/flags/vsmall/', Geo, '.png" alt="Flag">')) %>%
  select(nace_r2, Geo, values) %>%
  
  spread(Geo, values) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

B - Mining

Code
lc_lci_lev %>%
  filter(geo %in% c("FR", "DE", "IT"),
         # SCPOLDPEN: Old age pension
         lcstruct == "D12_D4_MD5",
         # TOTAL: Total
         nace_r2 == "B",
         unit == "EUR") %>%
  year_to_date %>%
  
  ggplot + theme_minimal() + geom_line(aes(x = date, y = values, color = Geo)) +
  xlab("") + ylab("Labour Costs Other than Wages and Salaries") +
  scale_color_manual(values = c("#002395", "#000000", "#009246")) +
  add_3flags +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_continuous(breaks = seq(0, 60, 1),
                     labels = scales::dollar_format(su = "€", p = ""))

B-E - Industry (except construction)

Code
lc_lci_lev %>%
  filter(geo %in% c("FR", "DE", "IT"),
         # SCPOLDPEN: Old age pension
         lcstruct == "D12_D4_MD5",
         # TOTAL: Total
         nace_r2 == "B-E",
         unit == "EUR") %>%
  year_to_date %>%
  
  ggplot + theme_minimal() + geom_line(aes(x = date, y = values, color = Geo)) +
  xlab("") + ylab("Labour Costs Other than Wages and Salaries") +
  scale_color_manual(values = c("#002395", "#000000", "#009246")) +
  add_3flags +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 1), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_continuous(breaks = seq(0, 60, 1),
                     labels = scales::dollar_format(su = "€", p = ""))

C - Manufacturing

Code
lc_lci_lev %>%
  filter(geo %in% c("FR", "DE", "IT"),
         # SCPOLDPEN: Old age pension
         lcstruct == "D12_D4_MD5",
         # TOTAL: Total
         nace_r2 == "C",
         unit == "EUR") %>%
  year_to_date %>%
  
  ggplot + theme_minimal() + geom_line(aes(x = date, y = values, color = Geo)) +
  xlab("") + ylab("Labour Costs Other than Wages and Salaries") +
  scale_color_manual(values = c("#002395", "#000000", "#009246")) +
  add_3flags +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 1), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = "none") +
  scale_y_continuous(breaks = seq(0, 60, 1),
                     labels = scales::dollar_format(su = "€", p = ""))