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
sql查询结果列拼接成逗号分隔的字符串方法
May 25 SQL Server
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
Jun 30 SQL Server
SQL语句中JOIN的用法场景分析
Jul 25 SQL Server
Spark SQL 2.4.8 操作 Dataframe的两种方式
Oct 16 SQL Server
sql时间段切分实现每隔x分钟出一份高速门架车流量
Feb 28 SQL Server
SQL Server中常用截取字符串函数介绍
Mar 16 SQL Server
SQL Server远程连接的设置步骤(图文)
Mar 23 SQL Server
SQL Server表分区降低运维和维护成本
Apr 08 SQL Server
SQL Server Agent 服务无法启动
Apr 20 SQL Server
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
May 25 SQL Server
SQL Server数据库备份和恢复数据库的全过程
Jun 14 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 调试利器debug_print_backtrace()
2012/07/23 PHP
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
递归删除一个节点以及该节点下的所有节点示例
2014/03/19 PHP
jquery之Document元素选择器篇
2008/08/14 Javascript
JavaScript 学习笔记一些小技巧
2010/03/28 Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
2013/11/13 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
javascript 操作符(~、&、|、^、)使用案例
2014/12/31 Javascript
javascript动画算法实例分析
2015/07/31 Javascript
jQuery+PHP+MySQL二级联动下拉菜单实例讲解
2015/10/27 Javascript
Bootstrap Fileinput文件上传组件用法详解
2016/05/10 Javascript
nodejs微信公众号支付开发
2016/09/19 NodeJs
js滚轮事件兼容性问题需要注意哪些
2016/11/15 Javascript
CSS+jQuery实现简单的折叠菜单
2016/12/20 Javascript
详解js跨域请求的两种方式,支持post请求
2018/05/05 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
2020/07/14 Javascript
[03:27]最受玩家喜爱奖提名:PZH_Element 致玩家寄语
2016/12/20 DOTA
[52:40]完美世界DOTA2联赛PWL S2 Magma vs GXR 第一场 11.29
2020/12/02 DOTA
python统计文本字符串里单词出现频率的方法
2015/05/26 Python
python实现多线程的方式及多条命令并发执行
2016/06/07 Python
python3大文件解压和基本操作
2017/12/15 Python
Python中的并发处理之asyncio包使用的详解
2018/04/03 Python
python3实现表白神器
2019/04/09 Python
python进阶之自定义可迭代的类
2019/08/20 Python
python opencv图片编码为h264文件的实例
2019/12/12 Python
使用Keras画神经网络准确性图教程
2020/06/15 Python
Python魔术方法专题
2020/06/19 Python
python判断元素是否存在的实例方法
2020/09/24 Python
Halston Heritage官网:简洁的日装,稍显奢华的晚装
2018/11/20 全球购物
小区停车场管理制度
2014/01/27 职场文书
个人租房协议书
2014/04/09 职场文书
内勤岗位职责
2015/02/10 职场文书
工程项目合作意向书
2015/05/08 职场文书
八年级地理课件资料及考点知识分享
2019/08/30 职场文书
MySQL系列之一 MariaDB-server安装
2021/07/02 MySQL