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 相关文章推荐
SQL Server数据定义——模式与基本表操作
Apr 05 SQL Server
SQLServer2019 数据库的基本使用之图形化界面操作的实现
Apr 08 SQL Server
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
Jun 30 SQL Server
SqlServer数据库远程连接案例教程
Jul 15 SQL Server
利用 SQL Server 过滤索引提高查询语句的性能分析
Jul 15 SQL Server
sql server删除前1000行数据的方法实例
Aug 30 SQL Server
sql server 累计求和实现代码
Feb 28 SQL Server
sqlserver连接错误之SQL评估期已过的问题解决
Mar 23 SQL Server
SQL Server中的游标介绍
May 20 SQL Server
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
May 25 SQL Server
SQL中的连接查询详解
Jun 21 SQL Server
在SQL Server中使用 Try Catch 处理异常的示例详解
Jul 15 SQL Server
sql字段解析器的实现示例
Jun 23 #SQL Server
解决sql server 数据库,sa用户被锁定的问题
在 SQL 语句中处理 NULL 值的方法
Jun 07 #SQL Server
sql中mod()函数取余数的用法
sql查询结果列拼接成逗号分隔的字符串方法
如何有效防止sql注入的方法
SQL 窗口函数实现高效分页查询的案例分析
You might like
PHP 如何利用phpexcel导入数据库
2013/08/24 PHP
php文件上传的例子及参数详解
2013/12/12 PHP
推荐一本PHP程序猿都应该拜读的书
2014/12/31 PHP
js获取class的所有元素
2013/03/28 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
js跳转页面方法总结
2014/01/29 Javascript
深入学习AngularJS中数据的双向绑定机制
2016/03/04 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
2017/02/17 Javascript
AngularJS学习笔记之表单验证功能实例详解
2017/07/06 Javascript
js单页hash路由原理与应用实战详解
2017/08/14 Javascript
使用InstantClick.js让页面提前加载200ms
2017/09/12 Javascript
微信小程序switch开关选择器使用详解
2018/01/31 Javascript
JS实现百度网盘任意文件强制下载功能
2018/08/31 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
JS实现星星海特效
2019/12/24 Javascript
vue使用微信扫一扫功能的实现代码
2020/04/11 Javascript
js中复选框的取值及赋值示例详解
2020/10/18 Javascript
如何管理Vue中的缓存页面
2021/02/06 Vue.js
wxPython学习之主框架实例
2014/09/28 Python
python编写简单爬虫资料汇总
2016/03/22 Python
python pandas中DataFrame类型数据操作函数的方法
2018/04/08 Python
PyQt5实现下载进度条效果
2018/04/19 Python
win10系统下Anaconda3安装配置方法图文教程
2018/09/19 Python
Python实现的各种常见分布算法示例
2018/12/13 Python
django的settings中设置中文支持的实现
2019/04/28 Python
python实现ftp文件传输功能
2020/03/20 Python
Django数据库迁移常见使用方法
2020/11/12 Python
python xlsxwriter模块的使用
2020/12/24 Python
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
CSS3的颜色渐变效果的示例代码
2017/09/29 HTML / CSS
用HTML5.0制作网页的教程
2010/05/30 HTML / CSS
英国电气世界:Electrical World
2019/09/08 全球购物
New delete 与malloc free 的联系与区别
2013/02/04 面试题
先进个人推荐材料
2014/12/29 职场文书
2016教师给学生的毕业寄语
2015/12/04 职场文书
python 提取html文本的方法
2021/05/20 Python