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
SQLServer2008提示评估期已过解决方案
Apr 12 SQL Server
利用 SQL Server 过滤索引提高查询语句的性能分析
Jul 15 SQL Server
SQL写法--行行比较
Aug 23 SQL Server
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
Sep 04 SQL Server
详解在SQLPlus中实现上下键翻查历史命令的功能
Mar 18 SQL Server
SQL CASE 表达式的具体使用
Mar 21 SQL Server
SQL Server 中的事务介绍
May 20 SQL Server
SQL SERVER中的流程控制语句
May 25 SQL Server
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
May 25 SQL Server
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
May 25 SQL Server
SQL Server删除表中的重复数据
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
如何去掉文章里的 html 语法
2006/10/09 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
POST一个JSON格式的数据给Restful服务实例详解
2017/04/07 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
xml 与javascript结合的问题解决方法
2007/03/24 Javascript
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
2009/11/04 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
2013/11/21 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
JavaScript阻止回车提交表单的方法
2015/12/30 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
Easyui Tree获取当前选择节点的所有顶级父节点
2017/02/14 Javascript
vue指令v-html使用过滤器filters功能实例
2019/10/25 Javascript
Vue-cli3多页面配置详解
2020/03/22 Javascript
详解elementUI中input框无法输入的问题
2020/04/27 Javascript
[01:41]DOTA2超级联赛专访YYF 称一辈子难忘TI2
2013/05/28 DOTA
python中使用OpenCV进行人脸检测的例子
2014/04/18 Python
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
python web框架学习笔记
2016/05/03 Python
对python的unittest架构公共参数token提取方法详解
2018/12/17 Python
通过字符串导入 Python 模块的方法详解
2019/10/27 Python
python如何查看安装了的模块
2020/06/23 Python
使用HTML5拍照示例代码
2013/08/06 HTML / CSS
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
StubHub意大利:购买和出售全球演唱会和体育赛事门票
2017/11/21 全球购物
伦敦眼门票在线预订:London Eye
2018/05/31 全球购物
室内设计自我鉴定
2013/10/15 职场文书
计算机网络专业个人的自我评价
2013/10/17 职场文书
银行实习生的自我评价
2014/01/13 职场文书
学生会主席就职演讲稿
2014/01/14 职场文书
料理师求职信
2014/01/30 职场文书
文明城市创建标语
2014/06/16 职场文书
索尼ICF-36收音机评测
2022/04/30 无线电
win10双系统怎么删除一个系统?win10电脑有两个系统删除一个的操作方法
2022/07/15 数码科技