Запрос на объединение данных строк в каждой группе

У меня есть следующие записи:

Date            Id      Ethnicity   Gender      Age 
-----------------------------------------------------
2021-03-25      001     NULL        NULL        39
2021-03-25      001     Hispanic    Male        39
2022-02-01      002     NULL        NULL        NULL
2022-02-01      002     Unknown     Male        27
2022-02-01      002     Hispanic    Male        27
2022-02-01      002     NULL        Male        NULL
2022-02-02      003     NULL        Male        Null
2022-02-02      003     White       Male        Null

Я хочу написать SQL-запрос на SQL Server для объединения Ethnicity, Gender и Age для каждой группы Date и ID.

2021-03-25          001     Hispanic, Male, 39
2022-02-01          002     Hispanic, Male, 27
2022-02-02          003     White, Male

Заранее спасибо!

Я пытался использовать STRING_AGG() для объединения этих столбцов, но данные дублируются, например, для идентификатора 002, я получил «Неизвестно, Мужчина, 27 лет, Латиноамериканец, Мужчина, 27 лет, Мужчина».

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

SELECT 
    Date, Id, 
    STRING_AGG(Ethnicity, ', ') AS EthnicityGenderAge
FROM
    YourTableName
WHERE 
    Ethnicity IS NOT NULL
    AND Gender IS NOT NULL
    AND Age IS NOT NULL
GROUP BY 
    Date, Id;

Но на самом деле это не объединяет столбцы Ethnicity, Gender и Age в новый, один столбец.....

marc_s 05.07.2024 22:27

Невозможно задать условие: Этническая принадлежность НЕ NULL, Пол НЕ NULL И Возраст НЕ NULL в пункте Where. Если этническая принадлежность в столбце внутри группы имеет значение null, мне все равно нужно объединить пол и возраст, если они не равны нулю.

zbx888 05.07.2024 22:35
Ответ принят как подходящий

Возможно что-то вроде этого?

SELECT  CONCAT_WS(', ', MAX(NULLIF(Ethnicity, 'Unknown')), MAX(NULLIF(gender, 'Unknown')), MAX(NULLIF(age, 'Unknown')))
,   Date, ID
FROM    (
    VALUES  (N'2021-03-25', N'001', NULL, NULL, 39)
    ,   (N'2021-03-25', N'001', N'Hispanic', N'Male', 39)
    ,   (N'2022-02-01', N'002', NULL, NULL, NULL)
    ,   (N'2022-02-01', N'002', N'Unknown', N'Male', 27)
    ,   (N'2022-02-01', N'002', N'Hispanic', N'Male', 27)
    ,   (N'2022-02-01', N'002', NULL, N'Male', NULL)
    ,   (N'2022-02-02', N'003', NULL, N'Male', NULL)
    ,   (N'2022-02-02', N'003', N'White', N'Male', NULL)
) t (Date,Id,Ethnicity,Gender,Age)
GROUP BY date,id

Это группирует даты и принимает максимальное значение для каждого значения, отфильтровывая неизвестные/нулевые значения. Конечно, если есть несколько ненулевых значений, это может вернуть неверные числа, но тогда вам нужно обновить вопрос, указав более подробную информацию.

Если у вас нет CONCAT_WS, вы можете использовать CONCAT с аналогичным эффектом.

Другие вопросы по теме