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——索引+基于单表的数据插入与简单查询【1】
Apr 05 SQL Server
SqlServer 垂直分表(减少程序改动)
Apr 16 SQL Server
利用 SQL Server 过滤索引提高查询语句的性能分析
Jul 15 SQL Server
SQL Server查询某个字段在哪些表中存在
Mar 03 SQL Server
通过T-SQL语句创建游标与实现数据库加解密功能
Mar 16 SQL Server
如何使用SQL Server语句创建表
Apr 12 SQL Server
SQL Server Agent 服务无法启动
Apr 20 SQL Server
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
Apr 22 SQL Server
SQL Server中锁的用法
May 20 SQL Server
SQL中的连接查询详解
Jun 21 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
解决Codeigniter不能上传rar和zip压缩包问题
2014/03/07 PHP
PHP批量删除、清除UTF-8文件BOM头的代码实例
2014/04/14 PHP
php打乱数组二维数组多维数组的简单实例
2016/06/17 PHP
php封装的smartyBC类完整实例
2016/10/19 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
JavaScript 乱码问题
2009/08/06 Javascript
COM中获取JavaScript数组大小的代码
2009/11/22 Javascript
结合JQ1.9通过js正则判断各种浏览器版本的方法
2013/12/30 Javascript
js 数组操作之pop,push,unshift,splice,shift
2014/01/29 Javascript
JQuery打造省市下拉框联动效果
2014/05/18 Javascript
JavaScript中判断原生函数检查function是否是原生代码
2014/09/09 Javascript
js Object2String方便查看js对象内容
2014/11/24 Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
2015/12/26 Javascript
学习Bootstrap滚动监听 附调用方法
2016/07/02 Javascript
简述vue中的config配置
2018/01/23 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
2019/09/01 Javascript
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
JavaScript函数IIFE使用详解
2019/10/21 Javascript
使用JS来动态操作css的几种方法
2019/12/18 Javascript
vue+elementUI实现简单日历功能
2020/09/24 Javascript
用Python实现命令行闹钟脚本实例
2016/09/05 Python
浅谈python写入大量文件的问题
2018/11/09 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
2018/12/02 Python
python搜索算法原理及实例讲解
2020/11/18 Python
python解包用法详解
2021/02/17 Python
简单聊聊H5的pushState与replaceState的用法
2018/04/03 HTML / CSS
浅谈amaze-ui中datepicker和datetimepicker注意的几点
2020/08/21 HTML / CSS
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
金融行业务员的自我评价
2013/12/13 职场文书
幼教毕业生自我鉴定
2014/01/12 职场文书
大队委竞选演讲稿
2014/04/28 职场文书
工作疏忽、懈怠的检讨书
2014/09/11 职场文书
公司新人试用期自我评价
2014/09/17 职场文书
2014年组织委员工作总结
2014/12/01 职场文书
2015年酒店前台工作总结
2015/04/20 职场文书