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 相关文章推荐
2021-4-5课程——SQL Server查询【3】
Apr 05 SQL Server
SQL Server 数据库实验课第五周——常用查询条件
Apr 05 SQL Server
SQL 窗口函数实现高效分页查询的案例分析
May 21 SQL Server
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
Jun 30 SQL Server
SQL Server代理:理解SQL代理错误日志处理方法
Jun 30 SQL Server
SQL SERVER实现连接与合并查询
Feb 24 SQL Server
详解在SQLPlus中实现上下键翻查历史命令的功能
Mar 18 SQL Server
SQL Server内存机制浅探
Apr 06 SQL Server
SQL Server 中的事务介绍
May 20 SQL Server
SQL使用复合索引实现数据库查询的优化
May 25 SQL Server
sql字段解析器的实现示例
Jun 23 #SQL Server
解决sql server 数据库,sa用户被锁定的问题
在 SQL 语句中处理 NULL 值的方法
Jun 07 #SQL Server
sql中mod()函数取余数的用法
sql查询结果列拼接成逗号分隔的字符串方法
如何有效防止sql注入的方法
SQL 窗口函数实现高效分页查询的案例分析
You might like
对squid中refresh_pattern的一些理解和建议
2009/04/17 PHP
在PHP中养成7个面向对象的好习惯
2010/01/28 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
php图像处理类实例
2015/07/28 PHP
浅谈PHP值mysql操作类
2016/06/29 PHP
JQuery获取或设置ckeditor的数据(示例代码)
2013/11/15 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
多个$(document).ready()的执行顺序实例分析
2014/07/26 Javascript
黑帽seo劫持程序,js劫持搜索引擎代码
2015/09/15 Javascript
Javascript将数字转化成为货币格式字符串
2016/06/22 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
3种不同的ContextMenu右键菜单实现代码
2016/11/03 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
简单实现js进度条加载效果
2020/03/25 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
mpvue 页面预加载新增preLoad生命周期的两种方式
2019/10/17 Javascript
vue 组件销毁并重置的实现
2020/01/13 Javascript
Python之多线程爬虫抓取网页图片的示例代码
2018/01/10 Python
PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上
2019/04/01 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
Pytorch 实现权重初始化
2019/12/31 Python
python dumps和loads区别详解
2020/02/04 Python
jupyter notebook读取/导出文件/图片实例
2020/04/16 Python
openCV提取图像中的矩形区域
2020/07/21 Python
Cinque网上商店:德国服装品牌
2019/03/17 全球购物
Linux操作面试题
2015/02/11 面试题
计算机专业毕业生推荐信
2013/11/25 职场文书
数字化校园建设方案
2014/05/03 职场文书
法人授权委托书样本
2014/09/19 职场文书
入党介绍人意见2015
2015/06/01 职场文书
学术研讨会主持词
2015/07/04 职场文书
2019年公司快递收发管理制度模板
2019/11/20 职场文书
CSS精灵图的原理与使用方法介绍
2022/03/17 HTML / CSS
在Oracle表中进行关键词搜索的过程
2022/06/10 Oracle