/ / JSON a SQL Server - json, sql-server, ssis

JSON a SQL Server - json, sql-server, ssis

Tengo acceso a los datos JSON, guardados en una base de datos del servidor SQL. Me gustaría crear un modelo de datos para la presentación de informes.

Aquí es cómo se ven mis datos ahora:

+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
|  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"}                                       |
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+

Usando SSIS puedo dividir esto en una tabla plana con campos para los valores JSON. Consigo esto como resultado:

+------------+----------+---------------+------------+------------+------------+-------------+-------------+-------------+
|  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           |             |
+------------+----------+---------------+------------+------------+------------+-------------+-------------+-------------+

Ahora aquí está mi problema, tome nota de los campos Lista _% _ n (ABC y Tipo). En mi muestra, la he limitado a 3, pero mis datos reales pueden tener más.
Quiero combinar cada uno de los tipos de lista en campos consolidados. Mi resultado final deseado sería así:

* He añadido un campo de secuencia, correspondiente a 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    |
+------------+-----------+----------+---------------+-----+------+

¿Cómo paso del estado actual a la salida deseada?

SSIS y SQL Server son las herramientas a las que tengo acceso.
Tengo acceso de escritura (para crear / modificar tablas, vistas, funciones, procesos almacenados, etc.) en el servidor.

Respuestas

1 para la respuesta № 1

Prueba esto...

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;

Para crear una nueva tabla de la tabla antigua ...

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

Salida

+-------------+----------+---------------+-----+------+----------+
|  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 |
+-------------+----------+---------------+-----+------+----------+

Demostración en línea: http://www.sqlfiddle.com/#!18/c0168/5/1