JSON для SQL Server

60
4

У меня есть доступ к данным JSON, сохраненным в базе данных SQL-сервера. Я хотел бы создать модель данных для отчетности.

Вот как выглядят мои данные сейчас:

+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Order_Id | JSON_Detail |
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Order_1001 | {"Customer":"Mario","BillingNumber":"99","List_ABC_0":"475","List_ABC_1":"461","List_ABC_2":"940","List_Type_0":"N","List_Type_1":"D","List_Type_2":"N"} |
| Order_1002 | {"Customer":"Luigi","BillingNumber":"61","List_ABC_0":"182","List_Type_0":"N"} |
| Order_1003 | {"Customer":"Toad","BillingNumber":"03","List_ABC_0":"028","List_ABC_1":"283","List_Type_0":"D","List_Type_1":"D"} |
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+

Используя SSIS, я могу разбить это на плоскую таблицу с полями для значений JSON. Я получаю это в результате:

+------------+----------+---------------+------------+------------+------------+-------------+-------------+-------------+
| Order_Id | Customer | BillingNumber | List_ABC_0 | List_ABC_1 | List_ABC_2 | List_Type_0 | List_Type_1 | List_Type_2 |
+------------+----------+---------------+------------+------------+------------+-------------+-------------+-------------+
| Order_1001 | Mario | 99 | 475 | 461 | 940 | N | D | N |
| Order_1002 | Luigi | 61 | 182 | | | N | | |
| Order_1003 | Toad | 03 | 028 | 283 | | D | D | |
+------------+----------+---------------+------------+------------+------------+-------------+-------------+-------------+

Теперь вот моя проблема, обратите внимание на поля List _% _ n (ABC и Type). В моем примере я ограничил его на 3, но у моих реальных данных может быть больше.
Я хочу объединить каждый из типов списка в консолидированные поля. Мой желаемый конечный результат будет таким:

* Я добавил поле последовательности, соответствующее n

+------------+-----------+----------+---------------+-----+------+
| Order_Id | Sequence | Customer | BillingNumber | ABC | Type |
+------------+-----------+----------+---------------+-----+------+
| Order_1001 | 0 | Mario | 99 | 475 | N |
| Order_1001 | 1 | Mario | 99 | 461 | D |
| Order_1001 | 2 | Mario | 99 | 940 | N |
| Order_1002 | 0 | Luigi | 61 | 182 | N |
| Order_1003 | 0 | Toad | 03 | 028 | D |
| Order_1003 | 1 | Toad | 03 | 283 | D |
+------------+-----------+----------+---------------+-----+------+

Как перейти от текущего состояния к нужному результату?

SSIS и SQL Server - это те инструменты, к которым у меня есть доступ.
У меня есть доступ на запись (для создания/изменения таблиц, представлений, функций, хранимых процедур и т.д.) На сервере.

спросил(а) 2021-01-19T16:20:52+03:00 1 месяц, 1 неделя назад
1
Решение
61

Попробуй это...

SELECT order_id, customer, billingnumber, abc, [type], 
Row_number() OVER (partition BY order_id ORDER BY order_id) - 1 AS [Sequence]
FROM tablename
CROSS apply (SELECT list_abc_0, list_type_0 UNION ALL
SELECT list_abc_1, list_type_1 UNION ALL
SELECT list_abc_2, list_type_2) Crs (abc, [Type])
WHERE abc IS NOT NULL AND type IS NOT NULL;

Чтобы создать новую таблицу из старой таблицы...

Select * into new_table  from (
SELECT order_id, customer, billingnumber, abc, [type],
Row_number() OVER (partition BY order_id ORDER BY order_id) - 1 AS [Sequence]
FROM tablename
CROSS apply (SELECT list_abc_0, list_type_0 UNION ALL
SELECT list_abc_1, list_type_1 UNION ALL
SELECT list_abc_2, list_type_2) Crs (abc, [Type])
WHERE abc IS NOT NULL AND type IS NOT NULL) tmp

Выход

+-------------+----------+---------------+-----+------+----------+
| order_id | customer | billingnumber | abc | type | Sequence |
+-------------+----------+---------------+-----+------+----------+
| Order_1001 | Mario | 99 | 475 | N | 0 |
| Order_1001 | Mario | 99 | 461 | D | 1 |
| Order_1001 | Mario | 99 | 940 | N | 2 |
| Order_1002 | Luigi | 61 | 182 | N | 0 |
| Order_1003 | Toad | 03 | 028 | D | 0 |
| Order_1003 | Toad | 03 | 283 | D | 1 |
+-------------+----------+---------------+-----+------+----------+

Демо-версия: http://www.sqlfiddle.com/#!18/c0168/5/1

ответил(а) 2021-01-19T16:20:52+03:00 1 месяц, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема