SQLServer中JSON文档型数据的查询问题解决


Posted in SQL Server onJune 27, 2021

近日在项目中遇到一个问题: 如何在报表中统计JSON格式存储的数据?

例如有个调查问卷记录表,记录每个问题的答案。 其结构示意如下(横表设计)

Id user date Q1_Answer Q2_Answer Q3_Answer
行Id 答题用户 答题日期 问题一结果 问题二结果 问题三结果

在[Q1_Answer]、[Q2_Answer]、[Q3_Answer]中记录的数据格式是JSON文档内容,因为是选项值,而且考虑到可能有多选, 所以存储的格式如下:

1 [ 
     {"code":"a", "desc":"Jan."},
     {"code":"b", "desc":"Feb."}
  ]

其中 code 表示选项, desc 表示选项的文字描述。

现在,用户想用PowerBI 来实现对结果的统计。有如下几个问题:

  • 在Power BI中,无法直接从JSON数据中读取到选项值
  • 如果是多选,又该如何处理。

比较适合分析的数据结构应该长这样:

行Id 答题用户 答题日期 问题编号 用户选项 选项文字
1 user1 2021-6-26 Q1 A Jan.
2 user1 2021-6-26 Q2 A Mon.
3 user1 2021-6-26 Q2 B Tue.
4 user1 2021-6-26 Q3 A Swimming
6 user2 2021-6-26 Q1 B Feb.
7 user2 2021-6-26 Q2 ... ...

 注意,上述Q2用户填了2个选项。 本身问卷设定就是支持多选的。 用JSON文档结构保存数据, 主要是为了方便采集和数据存取。因此要额外做些数据处理, 使采集的数据便于统计。

笔者经过一些调查, 发现可以结合使用UNPIVOT和OPENJSON方法来达到理想的效果。 具体过程如下:

准备表格和初始化数据

-- 1 create table
Create Table T_Questionaire(id int identity(1,1) primary key, username varchar(100), t1 nvarchar(500),t2 nvarchar(500),t3 nvarchar(500), dt datetime)


-- 2 init data
Insert into T_Questionaire( username, t1, t2, t3, dt) 
values ('John' , '[{"code":"a", "desc":"Monday"}]', '[{"code":"a", "desc":"Jan."}]', '[{"code":"b", "desc":"2021"}]' ,getdate())
 ,     ('Alice' , '[{"code":"b", "desc":"Tuesday"}]', '[{"code":"a", "desc":"Jan."}, {"code":"b", "desc":"Feb."}]', '[{"code":"a", "desc":"2020"},{"code":"b", "desc":"2021"}]' ,getdate())

数据内容:

SQLServer中JSON文档型数据的查询问题解决

 创建转换视图:

Create   or alter view V_VerticalQuestionaire 
as
with pt as (
select a.username, a.T, a.answers,  a.dt from dbo.T_Questionaire a
unpivot 
  (  answers for T in (t1,t2,t3  ))
a)
select pt.username, pt.dt, pt.T , aw.code, aw.[desc]
from pt 
  cross apply openjson(answers) WITH (code NVARCHAR(100) '$.code', [desc] NVARCHAR(100) '$.desc') aw

查询结果如下:

SQLServer中JSON文档型数据的查询问题解决

 总结下解决的思路:

1 先用unpivot将列行转换, 使横表记录变成纵表记录

2 使用openjson 将json数据转换为集合数据, 然后使用cross apply 将集合展开

好了,到此这篇关于SQLServer中JSON文档型数据的查询问题解决的文章就介绍到这了,更多相关SQLServer中JSON数据查询内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

SQL Server 相关文章推荐
SQLServer2019 数据库的基本使用之图形化界面操作的实现
Apr 08 SQL Server
sqlserver2017共享功能目录路径不可改的解决方法
Apr 16 SQL Server
sql通过日期判断年龄函数的示例代码
Jul 16 SQL Server
sqlserver连接错误之SQL评估期已过的问题解决
Mar 23 SQL Server
MSSQL基本语法操作
Apr 11 SQL Server
使用MybatisPlus打印sql语句
Apr 22 SQL Server
SQL SERVER中的流程控制语句
May 25 SQL Server
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
May 25 SQL Server
SQL Server中的逻辑函数介绍
May 25 SQL Server
SQL中的连接查询详解
Jun 21 SQL Server
在SQL Server中使用 Try Catch 处理异常的示例详解
Jul 15 SQL Server
SqlServer常用函数及时间处理小结
May 08 SQL Server
sql字段解析器的实现示例
Jun 23 #SQL Server
解决sql server 数据库,sa用户被锁定的问题
在 SQL 语句中处理 NULL 值的方法
Jun 07 #SQL Server
sql中mod()函数取余数的用法
sql查询结果列拼接成逗号分隔的字符串方法
如何有效防止sql注入的方法
SQL 窗口函数实现高效分页查询的案例分析
You might like
乱谈我对耳机、音箱的感受
2021/03/02 无线电
ThinkPHP采用原生query实现关联查询left join实例
2014/12/02 PHP
PHP实现的memcache环形队列类实例
2015/07/28 PHP
Laravel find in set排序实例
2019/10/09 PHP
20个非常有用的PHP类库 加速php开发
2010/01/15 Javascript
jtable列中自定义button示例代码
2013/11/21 Javascript
解决jquery中动态新增的元素节点无法触发事件问题的两种方法
2015/10/30 Javascript
JavaScript 七大技巧(二)
2015/12/13 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
2016/01/23 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
AngularJS ng-repeat数组有重复值的解决方法
2016/10/23 Javascript
JavaScript方法_动力节点Java学院整理
2017/06/28 Javascript
基于Bootstrap的标签页组件及bootstrap-tab使用说明
2017/07/25 Javascript
JavaScript原型对象、构造函数和实例对象功能与用法详解
2018/08/04 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
基于three.js实现的3D粒子动效实例代码
2019/04/09 Javascript
[01:59]游戏“zheng”当时试玩会
2019/08/21 DOTA
Python学习之asyncore模块用法实例教程
2014/09/29 Python
在Django中同时使用多个配置文件的方法
2015/07/22 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
性能测试工程师的面试题
2015/02/20 面试题
农救科工作职责
2013/11/27 职场文书
法人代表委托书
2014/04/04 职场文书
法人代表授权委托书
2014/04/08 职场文书
离婚协议书该怎么写
2014/10/04 职场文书
服务明星事迹材料
2014/12/29 职场文书
小升初自荐信范文
2015/03/05 职场文书
酒桌上的开场白
2015/06/01 职场文书
2019新学期家长会工作计划
2019/08/21 职场文书
vue项目支付功能代码详解
2022/02/18 Vue.js
「魔法少女伊莉雅」美游粘土人开订
2022/03/21 日漫
Nginx限流和黑名单配置
2022/05/20 Servers