Hourly Earnings

Data - OECD

Info

source dataset Title .html .rData
oecd HOU_EAR Hourly Earnings 2026-06-04 2026-06-04
oecd PRICES_CPI Consumer price indices (CPIs) 2024-04-16 2024-04-15

Data on wages

Code
load_data("wages.RData")
wages %>%
  source_dataset_title_file_updates()
Title source dataset .html .RData
Monthly minimum wages - bi-annual data eurostat earn_mw_cur 2026-06-04 2026-04-14
Labour cost index, nominal value - quarterly data eurostat ei_lmlc_q 2026-06-04 2026-04-14
Labour cost levels by NACE Rev. 2 activity eurostat lc_lci_lev 2026-06-04 2026-04-14
Labour cost index by NACE Rev. 2 activity - nominal value, quarterly data eurostat lc_lci_r2_q 2026-06-04 2026-04-14
Labour productivity and unit labour costs eurostat nama_10_lp_ulc 2026-06-04 2026-04-14
Labour productivity and unit labour costs eurostat namq_10_lp_ulc 2026-06-04 2026-04-14
Minimum wages eurostat tps00155 2026-06-04 2026-04-14
Wage fred wage 2026-06-04 2026-05-29
Mean nominal monthly earnings of employees by sex and economic activity -- Harmonized series ilo EAR_4MTH_SEX_ECO_CUR_NB_A 2024-06-20 2023-06-01
Mean nominal monthly earnings of employees by sex and economic activity -- Harmonized series ilo EAR_XEES_SEX_ECO_NB_Q 2024-06-20 2023-06-01
Average annual wages oecd AV_AN_WAGE 2026-06-04 2026-04-14
Taxing Wages - Comparative tables oecd AWCOMP 2026-06-04 2023-09-09
Hourly Earnings (MEI) oecd EAR_MEI 2026-06-04 2024-04-16
Household Dashboard oecd HH_DASH 2026-06-04 2023-09-09
Minimum relative to average wages of full-time workers - MIN2AVE oecd MIN2AVE 2026-02-22 2023-09-09
Real Minimum Wages - RMW oecd RMW 2026-06-04 2024-03-12
Unit labour costs and labour productivity (employment based), Total economy oecd ULC_EEQ 2026-06-04 2024-04-15

Last

obsTime FREQ Nobs
2025 A 6
2024 A 92
2023 A 95
2026-03 M 3
2026-02 M 3
2026-01 M 3
2026-Q1 Q 3
2025-Q4 Q 6
2025-Q3 Q 62

Detail

The Hourly Earnings dataset contains predominantly monthly statistics, and associated statistical methodological information, for the OECD member countries and for selected non-member economies.

The Hourly Earnings dataset provides monthly and quarterly data on employees’ earnings series. It includes earnings series in manufacturing and for the private economic sector. Mostly the sources of the data are business surveys covering different economic sectors, but in some cases administrative data are also used.

The target series for hourly earnings correspond to seasonally adjusted average total earnings paid per employed person per hour, including overtime pay and regularly recurring cash supplements. Where hourly earnings series are not available, a series could refer to weekly or monthly earnings. In this case, a series for full-time or full-time equivalent employees is preferred to an all employees series.

SECTOR

Code
HOU_EAR %>%
  group_by(SECTOR, `Institutional sector`) %>%
  summarise(nobs = n()) %>%
  arrange(-nobs) %>%
  print_table_conditional()
SECTOR Institutional sector nobs
S1 Total economy 32038
S1D Private sector 7431

ADJUSTMENT

Code
HOU_EAR %>%
  group_by(ADJUSTMENT, Adjustment) %>%
  summarise(nobs = n()) %>%
  arrange(-nobs) %>%
  print_table_conditional()
ADJUSTMENT Adjustment nobs
Y Calendar and seasonally adjusted 23894
N Neither seasonally adjusted nor calendar adjusted 15575

FREQ

Code
HOU_EAR %>%
  group_by(FREQ, `Frequency of observation`) %>%
  summarise(nobs = n()) %>%
  arrange(-nobs) %>%
  print_table_conditional()
FREQ Frequency of observation nobs
M Monthly 20904
Q Quarterly 14785
A Annual 3780

REF_AREA

Code
HOU_EAR %>%
  group_by(REF_AREA, Ref_area) %>%
  summarise(Nobs = n()) %>%
  mutate(Flag = gsub(" ", "-", str_to_lower(gsub(" ", "-", Ref_area))),
         Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) %>%
  select(Flag, everything()) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

obsTime

Code
HOU_EAR %>%
  group_by(obsTime) %>%
  summarise(Nobs = n()) %>%
  arrange(desc(obsTime)) %>%
  print_table_conditional()

Eurozone, United States

All

Code
HOU_EAR %>%
  filter(SECTOR == "S1",
         FREQ == "Q",
         REF_AREA %in% c("USA", "EA19"),
         ADJUSTMENT == "Y") %>%
  quarter_to_date %>%
  mutate(Ref_area = ifelse(REF_AREA == "EA19", "Europe", Ref_area)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "EA19", color2, color)) %>%
  rename(Location = Ref_area) %>%
  ggplot(.) + geom_line(aes(x = date, y = obsValue, color = color)) + 
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1920, 2100, 5) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_log10(breaks = seq(10, 500, 10),
                     labels = scales::dollar_format(accuracy = 1, suffix = "", prefix = "")) +
  ylab("") + xlab("")

1996-

Quarterly

Code
HOU_EAR %>%
  filter(SECTOR == "S1",
         FREQ == "Q",
         REF_AREA %in% c("USA", "EA19"),
         ADJUSTMENT == "Y") %>%
  quarter_to_date %>%
  filter(date >= as.Date("1996-01-01")) %>%
  
  group_by(REF_AREA) %>%
  arrange(date) %>%
  mutate(obsValue = 100*obsValue/obsValue[1]) %>%
  mutate(Ref_area = ifelse(REF_AREA == "EA19", "Europe", Ref_area)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "EA19", color2, color)) %>%
  rename(Location = Ref_area) %>%
  ggplot(.) + geom_line(aes(x = date, y = obsValue, color = color)) + 
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1996, 2100, 2) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_log10(breaks = seq(10, 500, 10),
                     labels = scales::dollar_format(accuracy = 1, suffix = "", prefix = "")) +
  ylab("") + xlab("")

2019Q4

Quarterly

Code
HOU_EAR %>%
  filter(SECTOR == "S1",
         FREQ == "Q",
         REF_AREA %in% c("USA", "EA19", "FRA", "DEU"),
         ADJUSTMENT == "Y") %>%
  quarter_to_date %>%
  filter(date >= as.Date("2019-10-01")) %>%
  
  group_by(REF_AREA) %>%
  arrange(date) %>%
  mutate(obsValue = 100*obsValue/obsValue[1]) %>%
  mutate(Ref_area = ifelse(REF_AREA == "EA19", "Europe", Ref_area)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "EA19", color2, color)) %>%
  rename(Location = Ref_area) %>%
  ggplot(.) + geom_line(aes(x = date, y = obsValue, color = color)) + 
  scale_color_identity() + theme_minimal() + add_4flags +
  scale_x_date(breaks = seq(1996, 2100, 1) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_log10(breaks = seq(10, 500, 2),
                     labels = scales::dollar_format(accuracy = 1, suffix = "", prefix = "")) +
  ylab("") + xlab("")

Quarterly

Code
HOU_EAR %>%
  filter(SECTOR == "S1",
         FREQ == "Q",
         REF_AREA %in% c("USA", "EA19", "FRA", "EU27_2020"),
         ADJUSTMENT == "Y") %>%
  quarter_to_date %>%
  filter(date >= as.Date("2019-10-01")) %>%
  
  group_by(REF_AREA) %>%
  arrange(date) %>%
  mutate(obsValue = 100*obsValue/obsValue[1]) %>%
  mutate(Ref_area = ifelse(REF_AREA == "EA19", "Europe", Ref_area)) %>%
  ggplot(.) + geom_line(aes(x = date, y = obsValue, color = Ref_area)) + 
  theme_minimal() +
  scale_x_date(breaks = seq(1996, 2100, 1) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_log10(breaks = seq(10, 500, 2),
                     labels = scales::dollar_format(accuracy = 1, suffix = "", prefix = "")) +
  ylab("") + xlab("")

Monthly

Code
HOU_EAR %>%
  filter(SECTOR == "S1",
         FREQ == "M",
         REF_AREA %in% c("USA", "EA19"),
         ADJUSTMENT == "Y") %>%
  month_to_date %>%
  filter(date >= as.Date("1996-01-01")) %>%
  
  group_by(REF_AREA) %>%
  arrange(date) %>%
  mutate(obsValue = 100*obsValue/obsValue[1]) %>%
  mutate(Ref_area = ifelse(REF_AREA == "EA19", "Europe", Ref_area)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "EA19", color2, color)) %>%
  rename(Location = Ref_area) %>%
  ggplot(.) + geom_line(aes(x = date, y = obsValue, color = color)) + 
  scale_color_identity() + theme_minimal() + add_2flags +
  scale_x_date(breaks = seq(1996, 2100, 2) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_log10(breaks = seq(10, 500, 10),
                     labels = scales::dollar_format(accuracy = 1, suffix = "", prefix = "")) +
  ylab("") + xlab("")

Eurozone, Japan, United States, United Kingdom

All

Code
HOU_EAR %>%
  filter(SECTOR == "S1",
         FREQ == "Q",
         REF_AREA %in% c("USA", "JPN", "EA19", "GBR", "HUN", "POL"),
         ADJUSTMENT == "Y") %>%
  quarter_to_date %>%
  
  mutate(Ref_area = ifelse(REF_AREA == "EA19", "Europe", Ref_area)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "EA19", color2, color)) %>%
  rename(Location = Ref_area) %>%
  ggplot(.) + geom_line(aes(x = date, y = obsValue, color = color)) + 
  scale_color_identity() + theme_minimal() + add_6flags +
  scale_x_date(breaks = seq(1920, 2100, 2) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_log10(breaks = seq(10, 500, 10),
                     labels = scales::dollar_format(accuracy = 1, suffix = " k", prefix = "")) +
  ylab("") + xlab("")

2015-

Code
HOU_EAR %>%
  filter(SECTOR == "S1",
         FREQ == "Q",
         REF_AREA %in% c("USA", "JPN", "EA19", "GBR", "HUN", "POL"),
         ADJUSTMENT == "Y") %>%
  quarter_to_date %>%
  filter(date >= as.Date("2015-01-01")) %>%
  
  mutate(Ref_area = ifelse(REF_AREA == "EA19", "Europe", Ref_area)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "EA19", color2, color)) %>%
  rename(Location = Ref_area) %>%
  ggplot(.) + geom_line(aes(x = date, y = obsValue, color = color)) + 
  scale_color_identity() + theme_minimal() + add_6flags +
  scale_x_date(breaks = seq(1920, 2100, 1) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_log10(breaks = seq(10, 500, 10),
                     labels = scales::dollar_format(accuracy = 1, suffix = "", prefix = "")) +
  ylab("") + xlab("")