JSON для SQL Server
У меня есть доступ к данным 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 - это те инструменты, к которым у меня есть доступ.
У меня есть доступ на запись (для создания/изменения таблиц, представлений, функций, хранимых процедур и т.д.) На сервере.
Попробуй это...
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