Output path
SQL:[IDI_Community].[dsbl_klinefelter].[klinefelter_YYYYMM]
SAS: libname cmid dsn=idi_community_srvprd schema=dsbl_klinefelter; run ;
How to access a code module in the Data Lab:Read here
Description
The purpose of this code module is to identify individuals in New Zealand in the IDI who have a recorded diagnosis of Klinefelter syndrome.
The dataset will list individuals, the earliest event when an individual has a recorded diagnosis of Klinefelter syndrome in the IDI, date of the earliest event, the individual’s age and whether they are alive at the time of the IDI refresh. For those individuals who have died, the dataset lists a date of death and age at death.
This module is not intended to be used to give a true prevalence rate of people in New Zealand with Klinefelter syndrome due to limitations of the datasets included in the IDI and since Klinefelter syndrome as a condition is underdiagnosed and diagnosed late (Herlihy et al, 2011). The code module allows researchers to have a consistent way of identifying people with Klinefelter syndrome and will allow for comparisons of outcomes for people with Klinefelter syndrome and people without Klinefelter syndrome.
Key Concepts
- Individuals are identified from a diagnosis recorded using a recognised ICD-9-CM-A diagnosis code for Klinefelter syndrome or a diagnosis recorded through other means by a professional.
- An individual may have multiple entries in a source dataset or across a number of source datasets.
- This module collates the earliest reference to the individual with an appropriate diagnosis code in each source dataset and then identifies the earliest reference amongst all datasets.
- The module indicates whether the individual was alive at the time of the most recent IDI refresh.
- The module will record events within the time period that data is included in the IDI. However, as a genetic condition an individual diagnosed with Klinefelter syndrome will have had the condition since birth.
- The earliest date recorded in the IDI is not a date of diagnosis or onset of a condition.
Business history
Code history and ICD code notes
ICD codes used are based on the ICD clinical code system for the earliest date of data as per Health New Zealand (HNZ) | Te Whatu Ora best practice. This means ICD-9-CM-A codes have been used in line with the start of the health-related datasets in the IDI.
On advice from HNZ clinical coding/classification staff, codes have first been looked up directly in ICD-10-AM 12th Edition (current Edition used), then back mapped to ICD-10-AM 1st Edition and then back mapped to ICD-9-CM-A codes.
Notes for specific datasets
-
For the MORT dataset, ICD codes have only been provided in their submitted system codes (i.e. not backmapped). This means the source dataset includes both ICD-9-CM-A and editions of ICD-10-AM and the code underlying this module has been written to reflect this.
-
For the PRIMHD dataset, codes have been provided DSM-IV and ICD-10-AM edition codes. This means the source dataset includes both DSM-IV and ICD-10-AM editions and the code underlying this module has been written to reflect this.
-
For the MHINC dataset, codes have been provided in various ICD code editions as well as backmapping to DSM-IV where possible. This means the source dataset includes both DSM-IV and ICD-9-CM-A/ICD-10-AM editions and the code underlying this module has been written to reflect this.
References
- Beltran-Castillon L and McLeod K (2023) From Data to Dignity: Health and Wellbeing Indicators for New Zealanders with Intellectual Disability. Published: IHC, Kōtātā Insight
- Herlihy AS, Halliday JL, Cock ML and McLachlan RI (2011) The prevalence and diagnosis rates of Klinefelter syndrome: an Australian comparison. Med. J. Aust. 194 (1): 24-28
Community of Interest
| Domain | Agency | Person |
|---|---|---|
| Initial code | SIA | Craig Wright |
| Module coder | Whaikaha - Ministry of Disabled People | Adelaide Wilson |
| Module coder | Nicholson Consulting | Sarah Underwood |
| Lead SME/Policy | Whaikaha - Ministry of Disabled People | Michelle Gezentsvey, Claire Bretherton |
Key business rules
| Dataset name | Diagnosis definition | Dataset time period |
|---|---|---|
| Publicly funded hospital discharges (NMDS) | A publicly funded hospital discharge with a primary or secondary diagnosis ICD-9-CM-A diagnosis code of: | 1988 - |
| 7587 (Klinefelter’s syndrome). | ||
| Privately funded hospital discharges (NMDS) | A privately funded hospital discharge with a primary or secondary diagnosis ICD-9-CM-A diagnosis code of: | 2001 - |
| 7587 (Klinefelter’s syndrome). | ||
| Mortality Collection (MORT) | Identified as an underlying or contributing cause of death with an ICD-9-CM-A diagnosis code of: | 1988 - |
| 7587 (Klinefelter’s syndrome), | ||
| or an ICD-10-AM (12th edition) code of: | ||
| Q980 (Klinefelter’s syndrome karyotype 47,XXY (includes that with mosaicism)), | ||
| Q981 (Klinefelter’s syndrome, male with more than two X chromosomes), | ||
| Q982 (Klinefelter’s syndrome, male with 46, XX karyotype), or | ||
| Q984 (Klinefelter’s syndrome, unspecified). | ||
| Disability Support Services database (SOCRATES) | Recorded as having Klinefelter’s syndrome in the Referral Diagnosis/Health Condition field with the code of: | 1998 - |
| 1104 (Klinefelter’s syndrome). | ||
| Programme for the Integration of Mental Health Data (PRIMHD) | There is no code for Klinefelter’s syndrome in the DSM-IV classification system for secondary mental health and addiction services. Identified with an ICD-10-AM (12th edition) code of: | 2009 - |
| Q980 (Klinefelter’s syndrome karyotype 47,XXY (includes that with mosaicism)), | ||
| Q981 (Klinefelter’s syndrome, male with more than two X chromosomes), | ||
| Q982 (Klinefelter’s syndrome, male with 46, XX karyotype), or | ||
| Q984 (Klinefelter’s syndrome, unspecified). | ||
| Mental Health Information National Collection (MHINC) | There is no code for Klinefelter’s syndrome in the DSM-IV classification system for secondary mental health and addiction services. Identified with an ICD-9-CM-A diagnosis code of: | July 2001 - 2008 |
| 7587 (Klinefelter’s syndrome). | ||
Data quality and other known issues
-
Not all individuals in New Zealand diagnosed with Klinefelter’s syndrome will be identified in this module. The module requires that the individual has had hospital discharge events, received
Disability Support Services, or had their death recorded where the diagnosis of Klinefelter syndrome has been specified. -
Datasets included have different lag times for having updated data available in the IDI. This means the completeness of the data at the time of analysis will depend on the lag time of the different datasets.
-
Individuals identified in the SOCRATES disability dataset do not always appear in the referral or needs assessment datasets as well. Where an individual is only identified through the SOCRATES disability dataset there is no associated event date. In this case a proxy date of ‘3999-12-31’ will be seen in the final table.
-
Diagnosis will not be consistent for all age groups. Klinefelter syndrome can be diagnosed prenatally (before birth) but this testing is not a routine test. Cases are also diagnosed following investigations into an individual’s reduced fertility and thus would be done when an individual is in the 20 to 40 age group. It is likely that people who are less severely affected are less likely to be diagnosed and thus identified in the data.
-
Registerable stillbirths are included in the mortality dataset.
Comparison against other sources
-
Counts of individuals published in the IHC publication ‘From Data to Dignity’, (2023) were for those individuals with Klinefelter syndrome in the study population defined as the 2018 Administrative Population Census (APC).The counts from this code module for people with Klinefelter syndrome are similar to those in the 2023 publication.
-
The published range of estimated prevalence for Klinefelter syndrome was given as 85 to 223 per 100,000 males based on combined newborn screening surveys from several countries (Herlihy et al, 2011). If this estimated prevalence is similar to New Zealand, this module undercounts people with Klinefelter syndrome.
Parameters
The following parameters should be supplied to this module to run it in the database:
- {targetdb}: The SQL database on which the spell datasets are to be created.
- {idicleanversion}: The IDI Clean version that the spell datasets need to be based on.
- {targetschema}: The project schema under the target database into which the spell datasets are to be created.
Dependencies
{idicleanrefresh}.[moh_clean].[pub_fund_hosp_discharges_event]
{idicleanrefresh}.[moh_clean].[priv_fund_hosp_discharges_diag]
{idicleanrefresh}.[moh_clean].[priv_fund_hosp_discharges_event]
{idicleanrefresh}.[moh_clean].[mortality_diagnosis]
{idicleanrefresh}.[moh_clean].[mortality_registrations]
{idicleanrefresh}.[moh_clean].[pop_cohort_demographics]
{idicleanrefresh}.[data].[personal_detail]
{idicleanrefresh}.[dia_clean].[deaths]
The following IDI_Adhoc are the most recent versions for this current refresh but changes to the code will need to be made as new datasets are uploaded into the IDI.
[IDI_Adhoc].[clean_read_MOH_SOCRATES].[moh_disability_2022]
[IDI_Adhoc].[clean_read_MOH_SOCRATES].[moh_needs_assessment_2022]
[IDI_Adhoc].[clean_read_MOH_SOCRATES].[moh_referral_2022]
[IDI_Adhoc].[clean_read_MOH_PRIMHD].[primhd_diagnoses_202502]
[IDI_Adhoc].[clean_read_MOH_PRIMHD].[moh_primhd_mhinc]
Outputs
{targetdb}.{targetschema}.klinefelter_syndrome
| Column name | Description |
|---|---|
| snz_uid | The unique Stats NZ person identifier for the the individual |
| type | A string indicating which condition of disability this table has identified (hard-coded to “KS”) |
| entity | A string indicating the organisation or provider ID that has provided a service for mental health services, where relevant |
| source_table | A string that states the data source for the earliest record of diagnosis for an individual in the IDI |
| min_date | The earliest record of diagnosis for an individual in the IDI (Note: not a date of diagnosis or onset of a condition) |
| snz_sex_gender_code | Code for an individual’s gender |
| snz_birth_month_nbr | Month of an individual’s birth |
| snz_birth_year_nbr | Year of an individual’s birth |
| snz_birth_date_proxy | Proxy date of an individual’s birth |
| age | Age of an individual at the time of the IDI refresh |
| death_status | A binary indicator indicating whether an individual is recorded dead (value = 1) or alive (value = 0) at the time of refresh |
| snz_deceased_year_nbr | Year of an individual’s death (if relevant) |
| snz_deceased_month_nbr | Month of an individual’s death (if relevant) |
| dod | Date of death (if relevant) |
| age_at_death | Age of an individual at death (if relevant) |
Variable descriptions
Granularity:
One row represents an individual, the earliest identification of their diagnosis in the IDI, birthdate, gender and death (if applicable).
Module Version & Change History
| Date | Version | Comments |
|---|---|---|
| 26 May 2025 | Initial | Version based on specifications from Commissioning document |
| 31 October 2025 | 1.1 | Update to MoH publicly funded hospital discharge variable with 202510 refresh. Converted moh_evt_evst_date from datetime to date. |
Code
/*Establish database*/
/*Set Parameters*/
/*Ref date should be the 15th of the month of the refresh used*/
:setvar targetdb "targetdb"
:setvar targetschema "targetschema"
:setvar idicleanversion "idicleanversion"
:setvar refdate "refdate"
:setvar idimetadataversion "idimetadataversion"
USE $(targetdb);
GO
/*Public hospital discharges where clinical code matches a diagnosis of Klinefelter's syndrome*/
DROP TABLE IF EXISTS #moh_pub_ks;
SELECT
b.snz_uid
,'MOH_PUB' AS source_table
,a.[moh_dia_submitted_system_code] AS code_sys
,a.[moh_dia_diagnosis_type_code]
,a.[moh_dia_event_id_nbr]
,a.[moh_dia_clinical_code]
,b.moh_evt_birth_year_nbr
,CAST(b.[moh_evt_evst_date] AS DATE) AS event_date
,CAST (NULL AS VARCHAR(10)) AS entity
INTO #moh_pub_ks
FROM [$(idicleanversion)].[moh_clean].[pub_fund_hosp_discharges_diag] AS a
LEFT JOIN [$(idicleanversion)].[moh_clean].[pub_fund_hosp_discharges_event] AS b ON a.moh_dia_event_id_nbr = b.moh_evt_event_id_nbr
WHERE (SUBSTRING(a.[moh_dia_clinical_code],1,4) IN ('7587') AND a.[moh_dia_clinical_sys_code] = '06' AND a.[moh_dia_diagnosis_type_code] IN ('A','B'));
/*Private hospital discharges where clinical code matches a diagnosis of Klinefelter's syndrome*/
DROP TABLE IF EXISTS #moh_pri_ks;
SELECT
b.snz_uid
,'MOH_PRI' AS source_table
,a.[moh_pri_diag_event_id_nbr]
,a.[moh_pri_diag_clinic_sys_code]
,a.[moh_pri_diag_sub_sys_code]
,a.[moh_pri_diag_diag_type_code]
,a.[moh_pri_diag_clinic_code]
,b.[moh_pri_evt_start_date] AS event_date
,CAST (NULL AS VARCHAR(10)) AS entity
INTO #moh_pri_ks
FROM [$(idicleanversion)].[moh_clean].[priv_fund_hosp_discharges_diag] AS a
LEFT JOIN [$(idicleanversion)].[moh_clean].[priv_fund_hosp_discharges_event] AS b ON a.moh_pri_diag_event_id_nbr = b.moh_pri_evt_event_id_nbr
WHERE (SUBSTRING(a.[moh_pri_diag_clinic_code],1,4) IN ('7587') AND a.[moh_pri_diag_clinic_sys_code] = '06' AND a.[moh_pri_diag_diag_type_code] IN ('A','B'));
/*Registrations in the mortality dataset where clinical code matches a diagnosis of Klinefelter's syndrome*/
DROP TABLE IF EXISTS #mos_ks;
SELECT
b.[snz_uid]
,b.[snz_moh_uid]
,'MOH_MOS' AS source_table
,DATEFROMPARTS(b.moh_mor_birth_year_nbr,b.moh_mor_birth_month_nbr,15) AS event_date
,a.[moh_mort_diag_clinical_code] AS code
,a.[moh_mort_diag_clinic_type_code]
,a.[moh_mort_diag_clinic_sys_code]
,a.[moh_mort_diag_diag_type_code]
,CAST (NULL AS VARCHAR(10)) AS entity
INTO #mos_ks
FROM [$(idicleanversion)].[moh_clean].[mortality_diagnosis] AS a
LEFT JOIN [$(idicleanversion)].[moh_clean].[mortality_registrations] AS b ON a.snz_dia_death_reg_uid = b.snz_dia_death_reg_uid
WHERE (SUBSTRING(a.[moh_mort_diag_clinical_code],1,4) IN ('7587') AND a.[moh_mort_diag_clinic_sys_code] ='06')
OR (SUBSTRING(a.[moh_mort_diag_clinical_code],1,4) IN ('Q980', 'Q981','Q982','Q984') AND a.[moh_mort_diag_clinic_sys_code] >= '10');
/* individuals in the Ministry of Health SOCRATES database with code 1104 .Date can either be first contact date or referral date.*/
DROP TABLE IF EXISTS #moh_soc_ks;
SELECT
DISTINCT
b.snz_uid
,'SOC' AS source_table
,CASE WHEN CAST(SUBSTRING(c.[FirstContactDate],1,7) AS date) IS NOT NULL THEN CAST(SUBSTRING(c.[FirstContactDate],1,7) AS date)
WHEN CAST(SUBSTRING(e.[ReferralDate],1,7) AS date) IS NOT NULL THEN CAST(SUBSTRING(e.[ReferralDate],1,7) AS date)
END AS event_date
,CAST (a.code as VARCHAR(7)) AS code
,a.[Description]
,CAST (NULL AS VARCHAR(10)) AS entity
INTO #moh_soc_ks
FROM [IDI_Adhoc].[clean_read_MOH_SOCRATES].[moh_disability_2022] AS a
LEFT JOIN [$(idicleanversion)].[moh_clean].[pop_cohort_demographics] AS b ON a.snz_moh_uid = b.snz_moh_uid
LEFT JOIN (SELECT DISTINCT snz_moh_uid,[FirstContactDate] FROM [IDI_Adhoc].[clean_read_MOH_SOCRATES].[moh_needs_assessment_2022] ) AS c ON a.snz_moh_uid = c.snz_moh_uid
LEFT JOIN (SELECT DISTINCT snz_moh_uid,[ReferralDate] FROM [IDI_Adhoc].[clean_read_MOH_SOCRATES].[moh_referral_2022]) AS e ON a.snz_moh_uid = e.snz_moh_uid
WHERE code IN ('1104');
/*looking for Klinfelter's syndrome diagnosis in PRIMHD diagnosis data*/
DROP TABLE IF EXISTS #moh_PRIMHD_ks;
SELECT
b.snz_uid
,a.[snz_moh_uid]
,'MOH_PRIMHD' AS source_table
,CAST (a.[organisation_id] AS VARCHAR(10)) AS entity
,a.[classification_code_id]
,a.[diagnosis_type]
,CONVERT(date,a.[classification_start_date],103) AS event_date
,a.[clinical_coding_system_id]
,a.[clinical_code] AS code
INTO #moh_PRIMHD_ks
FROM [IDI_Adhoc].[clean_read_MOH_PRIMHD].[primhd_diagnoses_202502] AS a
LEFT JOIN [$(idicleanversion)].[moh_clean].[pop_cohort_demographics] AS b ON a.snz_moh_uid = b.snz_moh_uid
WHERE (SUBSTRING(a.[clinical_code],1,4) IN ('Q980', 'Q981','Q982','Q984') AND a.[clinical_coding_system_id] >= '10');
/* looking for Klinfelter's syndrome diagnosis in PRIMHD MHINC data*/
DROP TABLE IF EXISTS #moh_mhinc_ks;
SELECT
b.snz_uid
,'MOH_MHINC' AS source_table
,CAST (a.[organisation_id] AS VARCHAR(10)) AS entity
,a.[classification_start] AS event_date
,a.[clinical_coding_system_id]
,a.[clinical_code] AS code
,a.[diagnosis_type]
INTO #moh_mhinc_ks
FROM [IDI_Adhoc].[clean_read_MOH_PRIMHD].[moh_primhd_mhinc] AS a
LEFT JOIN [$(idicleanversion)].[moh_clean].[pop_cohort_demographics] AS b ON a.snz_moh_uid = b.snz_moh_uid
WHERE (SUBSTRING(a.[clinical_code],1,4) IN ('7587') AND a.[clinical_coding_system_id] = '06');
/* collate data from all sources into one table*/
DROP TABLE IF EXISTS #ks;
SELECT
a.snz_uid
,MIN(event_date) AS min_date
,source_table
,entity
INTO #ks
FROM (
SELECT snz_uid, event_date, source_table, entity FROM #moh_pub_ks
UNION ALL
SELECT snz_uid, event_date, source_table, entity FROM #moh_pri_ks
UNION ALL
SELECT snz_uid, event_date, source_table, entity FROM #mos_ks
UNION ALL
SELECT snz_uid, event_date, source_table, entity FROM #moh_soc_ks
UNION ALL
SELECT snz_uid, event_date, source_table, entity FROM #moh_PRIMHD_ks
UNION ALL
SELECT snz_uid, event_date, source_table, entity FROM #moh_mhinc_ks
) AS a
GROUP BY snz_uid
, source_table
, entity;
/* subset of individuals who are deceased and are in death data*/
DROP TABLE IF EXISTS #ks_dd;
SELECT
a.*
,b.snz_birth_month_nbr
,b.snz_birth_year_nbr
,b.snz_sex_gender_code
,b.snz_deceased_year_nbr
,b.snz_deceased_month_nbr
,b.snz_birth_date_proxy
,NULL AS age
,DATEFROMPARTS(b.snz_deceased_year_nbr, b.snz_deceased_month_nbr, 15) AS dod
,'KS' AS [type]
INTO #ks_dd
FROM #ks as a
INNER JOIN [$(idicleanversion)].[data].[personal_detail] AS b ON a.snz_uid = b.snz_uid
WHERE a.snz_uid IN (SELECT DISTINCT snz_uid FROM [$(idicleanversion)].[dia_clean].[deaths])
AND b.snz_deceased_year_nbr IS NOT NULL;
/* subset of individuals who are deceased but not in death data*/
DROP TABLE IF EXISTS #ks_od;
SELECT
a.*
,b.snz_birth_month_nbr
,b.snz_birth_year_nbr
,b.snz_sex_gender_code
,b.snz_deceased_year_nbr
,b.snz_deceased_month_nbr
,b.snz_birth_date_proxy
,null AS age
,DATEFROMPARTS(b.snz_deceased_year_nbr, b.snz_deceased_month_nbr, 15) AS dod
,'KS' AS [type]
INTO #ks_od
FROM #ks AS a
INNER JOIN [$(idicleanversion)].[data].[personal_detail] AS b ON a.snz_uid = b.snz_uid
WHERE a.snz_uid NOT IN (SELECT DISTINCT snz_uid FROM [$(idicleanversion)].[dia_clean].[deaths])
AND b.snz_deceased_year_nbr IS NOT NULL;
/* subset of individuals who are alive*/
DROP TABLE IF EXISTS #ks_ad;
SELECT
a.*
,b.snz_birth_month_nbr
,b.snz_birth_year_nbr
,b.snz_sex_gender_code
,b.snz_deceased_year_nbr
,b.snz_deceased_month_nbr
,b.snz_birth_date_proxy
,DATEDIFF(YEAR, b.snz_birth_date_proxy, '$(refdate)') AS age
,'3999-12-31' AS dod
,'KS' AS [type]
INTO #ks_ad
FROM #ks AS a
INNER JOIN [$(idicleanversion)].[data].[personal_detail] AS b ON a.snz_uid = b.snz_uid
WHERE a.snz_uid NOT IN (SELECT DISTINCT snz_uid FROM [$(idicleanversion)].[dia_clean].[deaths])
AND a.snz_uid NOT IN (SELECT DISTINCT snz_uid FROM #ks_dd)
AND a.snz_uid NOT IN (SELECT DISTINCT snz_uid FROM #ks_od);
/* join all tables together*/
DROP TABLE IF EXISTS #ks_final;
WITH ks_union AS (
SELECT
*
FROM #ks_dd
UNION ALL
SELECT * FROM #ks_od
UNION ALL
SELECT * FROM #ks_ad
)
SELECT
*
,DATEDIFF(YEAR, snz_birth_date_proxy, dod) AS age_at_death
,CASE WHEN age IS NOT NULL THEN 0 ELSE 1 END AS death_status
INTO #ks_final
FROM ks_union;
/* select all required variables */
DROP TABLE IF EXISTS #ks_min;
SELECT
snz_uid
,[type]
,entity
,source_table
,min_date
,snz_sex_gender_code
,snz_birth_month_nbr
,snz_birth_year_nbr
,snz_birth_date_proxy
,age
,death_status
,snz_deceased_year_nbr
,snz_deceased_month_nbr
,CASE WHEN dod = '3999-12-31' THEN NULL ELSE dod END AS dod
,CASE WHEN age_at_death > 1000 THEN NULL ELSE age_at_death END AS age_at_death
INTO #ks_min
FROM #ks_final;
/*take earliest recorded date for each snz_uid and create table */
DROP TABLE IF EXISTS #ks_dbl;
SELECT
snz_uid
,[type]
,entity
,source_table
,min_date
,snz_sex_gender_code
,snz_birth_month_nbr
,snz_birth_year_nbr
,snz_birth_date_proxy
,age
,death_status
,snz_deceased_year_nbr
,snz_deceased_month_nbr
,dod
,age_at_death
INTO #ks_dbl
FROM #ks_min a
WHERE min_date = (
SELECT MIN(min_date)
FROM #ks_min b
WHERE b.snz_uid = a.snz_uid)
ORDER BY snz_uid;
/* remove duplicate snz_uid with the same minimum date but different entities or sources. Create table in IDI_Sandpit */
DROP TABLE IF EXISTS [$(targetdb)].[$(targetschema)].[klinefelters_syndrome];
WITH cte AS
(SELECT ROW_NUMBER() OVER(PARTITION BY snz_uid
ORDER BY snz_uid DESC) AS rn
FROM #ks_dbl)
DELETE FROM cte WHERE rn > 1;
SELECT
snz_uid
,[type]
,entity
,source_table
,min_date
,snz_sex_gender_code
,snz_birth_month_nbr
,snz_birth_year_nbr
,snz_birth_date_proxy
,age
,death_status
,snz_deceased_year_nbr
,snz_deceased_month_nbr
,dod
,age_at_death
INTO [$(targetdb)].[$(targetschema)].[klinefelters_syndrome]
FROM #ks_dbl