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数据库单表查询 4.3实验课
Apr 05 SQL Server
SQL写法--行行比较
Aug 23 SQL Server
sql server删除前1000行数据的方法实例
Aug 30 SQL Server
SQL SERVER存储过程用法详解
Feb 24 SQL Server
使用SQL实现车流量的计算的示例代码
Feb 28 SQL Server
SQL CASE 表达式的具体使用
Mar 21 SQL Server
SQLServer RANK() 排名函数的使用
Mar 23 SQL Server
SQL Server中的游标介绍
May 20 SQL Server
SQL Server中使用表变量和临时表
May 20 SQL Server
SQL解决未能删除约束问题drop constraint
May 30 SQL Server
SQL中的连接查询详解
Jun 21 SQL Server
sql字段解析器的实现示例
Jun 23 #SQL Server
解决sql server 数据库,sa用户被锁定的问题
在 SQL 语句中处理 NULL 值的方法
Jun 07 #SQL Server
sql中mod()函数取余数的用法
sql查询结果列拼接成逗号分隔的字符串方法
如何有效防止sql注入的方法
SQL 窗口函数实现高效分页查询的案例分析
You might like
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
php中的一些数组排序方法分享
2012/07/20 PHP
php中mkdir()函数的权限问题分析
2016/09/24 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
jquery 学习之一 对象访问
2010/11/23 Javascript
JavaScript传递变量: 值传递?引用传递?
2011/02/22 Javascript
javascript温习的一些笔记 基础常用知识小结
2011/06/22 Javascript
JavaScript 实现类的多种方法实例
2013/05/01 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
简述AngularJS相关的一些编程思想
2015/06/23 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
ES6中非常实用的新特性介绍
2016/03/10 Javascript
jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法
2016/08/17 Javascript
Bootstrap Modal遮罩弹出层(完整版)
2016/11/21 Javascript
node.js操作mongodb简单示例分享
2017/05/25 Javascript
在create-react-app中使用css modules的示例代码
2018/07/31 Javascript
Js中使用正则表达式验证输入是否有特殊字符
2018/09/07 Javascript
vue环形进度条组件实例应用
2018/10/10 Javascript
M2实现Nodejs项目自动部署的方法步骤
2019/05/05 NodeJs
js根据后缀判断文件文件类型的代码
2020/05/09 Javascript
vue实现评价星星功能
2020/06/30 Javascript
Vue+Element自定义纵向表格表头教程
2020/10/26 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
2020/10/30 Javascript
[12:36]《DOTA2》国服注册与激活指南全攻略
2013/04/28 DOTA
Python简单遍历字典及删除元素的方法
2016/09/18 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
Django中在xadmin中集成DjangoUeditor过程详解
2019/07/24 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
2020/06/28 Python
幼师专业求职推荐信
2013/11/08 职场文书
实习心得体会
2014/01/02 职场文书
社区十八大感言
2014/01/19 职场文书
水果超市创业计划书
2014/01/27 职场文书
竞聘书怎么写,如何写?
2014/03/31 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书