1

我可以访问保存在 SQL 服务器数据库中的 JSON 数据。我想创建一个用于报告的数据模型。

这是我的数据现在的样子:

+------------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
|  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 和类型)。在我的示例中,我将其上限设置为 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 是我可以使用的工具。
我在服务器上有写访问权限(创建/更改表、视图、函数、存储过程等)。

4

1 回答 1

1

尝试这个...

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

于 2018-05-09T02:34:56.420 回答