Я пытаюсь написать запрос, который группирует несколько столбцов в один основной тип столбца, называемый параметрами, вместо создания записи для каждого параметра. Это то, что у меня сейчас есть в таблице под названием автомобили.
Чего я ожидаю, так это:
Я не знаю, как написать этот запрос. Я пробовал использовать пересечение, но это сработало неправильно.
Я пишу этот запрос, чтобы он мог пройти через это приложение логики в Azure.
Я тоже делал все возможное, чтобы отформатировать ваши таблицы, однако первая из них вышла искаженной. Когда вы редактируете свое сообщение, чтобы исправить теги, пожалуйста, также исправьте образцы данных.
Вы действительно хотите, чтобы параметры имели эту дурацкую структуру псевдо-json? Почему бы не использовать настоящий JSON
@siggemannen, это может быть настоящий JSON, если так проще. Это форматирование существует в старой базе данных, поэтому я просто использовал его.
Не зная, какую систему обработки данных вы используете, мы по-прежнему не можем комментировать. SQL Server локально также не поддерживает JSON_ARRAYAGG, а в Azure он все еще находится в предварительной версии.
@ThomA Спасибо. Я соответствующим образом переформатировал. Спасибо за помощь.
@ThomA, извините, он использует SQL Server 2022 на управляемом экземпляре в Azure.


Вот пара идей:
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-версию вышеприведенного.
Замечательно. Обе процедуры работают. Однако нужно ли каждый раз вводить значения индивидуально? Будут добавлены дополнительные строки, которые должны отображаться в параметрах.
Я только что взял ваш образец данных. В вашем реальном запросе вы, конечно, должны выбирать из имеющейся у вас таблицы?
Это великолепно. Это сработало (обе процедуры). Спасибо, что написали это
Можно ли сохранить имена столбцов в параметрах, используя AS? (spec_name, displayMin, displayMax, state) во второй процедуре?
Не понимаю, что вы имеете в виду :/ Но вы, вероятно, можете просто объединить STRING_AGG с FOR JSON, если это ваша игра.
Я пошел дальше и удалил здесь конфликтующие теги; пожалуйста отредактируйте свой вопрос, чтобы (пере) пометить фактическую (R) СУБД, которую вы используете. Почему пометка нескольких продуктов РСУБД делает мой вопрос неясным?