Eu tenho acesso a dados JSON, salvos em um banco de dados do servidor SQL. Eu gostaria de criar um modelo de dados para relatórios.
Aqui está o que meus dados se parecem agora:
+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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 o SSIS, posso dividir isso em uma tabela simples com campos para os valores JSON. Eu entendo isso 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 | |
+------------+----------+---------------+------------+------------+------------+-------------+-------------+-------------+
Agora, aqui está o meu problema, tome nota dos campos List_% _n (ABC e Type). Na minha amostra, limitei-o em 3, mas os meus dados reais podem ter mais.
Eu quero combinar cada um dos tipos de lista em um campo consolidado. Meu resultado final desejado seria assim:
* Eu adicionei um campo de seqüência, correspondente 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 |
+------------+-----------+----------+---------------+-----+------+
Como eu vou do estado atual para a saída desejada?
SSIS e SQL Server são as ferramentas que eu tenho acesso.
Eu tenho acesso de gravação (para criar / alterar tabelas, exibições, funções, proc armazenado, etc ...) no servidor.
Respostas:
1 para resposta № 1Tente isso ...
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 criar uma nova tabela da tabela antiga ...
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
Saída
+-------------+----------+---------------+-----+------+----------+
| 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 |
+-------------+----------+---------------+-----+------+----------+
Demonstração Online: http://www.sqlfiddle.com/#!18/c0168/5/1