SQL-запрос для группировки параметров в один столбец с одинаковым идентификатором

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

car_id car_model car_lot имя_специализации дисплейМин дисплейМакс состояние 102 Тойота 2 Батарея 100 1 1 102 Тойота 2 Двигатель 1000 25 1 102 Тойота 2 Масло 90 9 1 103 BMW 2 Двигатель 2000 г. 50 1 103 BMW 2 Дроссель 20 5 0 103 BMW 2 Батарея 100 10 0

Чего я ожидаю, так это:

car_id car_model car_lot car_params 102 Тойота 2 параметры {(Батарея:100,1,1), (Двигатель:1000,25,1),(Масло:90,9,1)} 103 BMW 2 параметры {(Двигатель: 2000,50,1), (Дроссельная заслонка: 20,5,0), (Батарея: 100,10,0)}

Я не знаю, как написать этот запрос. Я пробовал использовать пересечение, но это сработало неправильно.

Я пишу этот запрос, чтобы он мог пройти через это приложение логики в Azure.

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

Thom A 21.08.2024 11:43

Вы действительно хотите, чтобы параметры имели эту дурацкую структуру псевдо-json? Почему бы не использовать настоящий JSON

siggemannen 21.08.2024 11:46

@siggemannen, это может быть настоящий JSON, если так проще. Это форматирование существует в старой базе данных, поэтому я просто использовал его.

Need Help 21.08.2024 11:50

Не зная, какую систему обработки данных вы используете, мы по-прежнему не можем комментировать. SQL Server локально также не поддерживает JSON_ARRAYAGG, а в Azure он все еще находится в предварительной версии.

Thom A 21.08.2024 11:54

@ThomA Спасибо. Я соответствующим образом переформатировал. Спасибо за помощь.

Need Help 21.08.2024 11:55

@ThomA, извините, он использует SQL Server 2022 на управляемом экземпляре в Azure.

Need Help 21.08.2024 11:56
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
7
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот пара идей:

SELECT  car_id, car_model, car_lot, 'params {' + string_agg(concat('(', spec_name, ':', displayMin, ',', displayMax, ',', state, ')'), ',') + '}'
FROM    (
    VALUES  (102, N'Toyota', 2, N'Battery', 100, 1, 1)
    ,   (102, N'Toyota', 2, N'Engine', 1000, 25, 1)
    ,   (102, N'Toyota', 2, N'Oil', 90, 9, 1)
    ,   (103, N'BMW', 2, N'Engine', 2000, 50, 1)
    ,   (103, N'BMW', 2, N'Throttle', 20, 5, 0)
    ,   (103, N'BMW', 2, N'Battery', 100, 10, 0)
) t (car_id,car_model,car_lot,spec_name,displayMin,displayMax,state)
GROUP BY car_id, car_model, car_lot


;WITH data AS (
    SELECT  *
    FROM    (
    VALUES  (102, N'Toyota', 2, N'Battery', 100, 1, 1)
    ,   (102, N'Toyota', 2, N'Engine', 1000, 25, 1)
    ,   (102, N'Toyota', 2, N'Oil', 90, 9, 1)
    ,   (103, N'BMW', 2, N'Engine', 2000, 50, 1)
    ,   (103, N'BMW', 2, N'Throttle', 20, 5, 0)
    ,   (103, N'BMW', 2, N'Battery', 100, 10, 0)
) t (car_id,car_model,car_lot,spec_name,displayMin,displayMax,state)
)
SELECT  car_id, car_model, car_lot, (
    SELECT  spec_name, displayMin, displayMax, state
    FROM    data dOuter
    WHERE   dOuter.car_id = d.car_id
    FOR json path, root('params')
    )
FROM    data d
GROUP BY car_id, car_model, car_lot

Первый использует STRING_AGG для агрегирования параметров в строку параметров «старого» стиля.

Второй выполняет json-версию вышеприведенного.

Замечательно. Обе процедуры работают. Однако нужно ли каждый раз вводить значения индивидуально? Будут добавлены дополнительные строки, которые должны отображаться в параметрах.

Need Help 21.08.2024 12:12

Я только что взял ваш образец данных. В вашем реальном запросе вы, конечно, должны выбирать из имеющейся у вас таблицы?

siggemannen 21.08.2024 12:13

Это великолепно. Это сработало (обе процедуры). Спасибо, что написали это

Need Help 21.08.2024 12:26

Можно ли сохранить имена столбцов в параметрах, используя AS? (spec_name, displayMin, displayMax, state) во второй процедуре?

Need Help 21.08.2024 12:48

Не понимаю, что вы имеете в виду :/ Но вы, вероятно, можете просто объединить STRING_AGG с FOR JSON, если это ваша игра.

siggemannen 21.08.2024 13:07

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