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 相关文章推荐
【HBU】数据库第四周 单表查询
Apr 05 SQL Server
SQLServer2008提示评估期已过解决方案
Apr 12 SQL Server
SQL 窗口函数实现高效分页查询的案例分析
May 21 SQL Server
SQLServer之常用函数总结详解
Aug 30 SQL Server
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
Sep 04 SQL Server
MySQL 中如何归档数据的实现方法
Mar 16 SQL Server
SQL Server实现分页方法介绍
Mar 16 SQL Server
SQL Server使用导出向导功能
Apr 08 SQL Server
SQL Server #{}可以防止SQL注入
May 11 SQL Server
SQL Server中的逻辑函数介绍
May 25 SQL Server
SQL bool盲注和时间盲注详解
Jul 23 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数据库操作方法(MYSQL版)
2011/06/08 PHP
php实现复制移动文件的方法
2015/07/29 PHP
PHP上传文件参考配置大文件上传
2015/12/16 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
模拟一个类似百度google的模糊搜索下拉列表
2014/04/15 Javascript
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
2015/05/18 Javascript
jQuery+Ajax+PHP+Mysql实现分页显示数据实例讲解
2015/09/27 Javascript
javascript伸缩菜单栏实现代码分享
2015/11/12 Javascript
使用NodeJs 开发微信公众号(三)微信事件交互实例
2016/03/02 NodeJs
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
vue实现带复选框的树形菜单
2019/05/27 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
2019/09/17 Javascript
vue.config.js中配置Vue的路径别名的方法
2020/02/11 Javascript
js实现动态时钟
2020/03/12 Javascript
[07:37]DOTA2-DPC中国联赛2月2日Recap集锦
2021/03/11 DOTA
Python中的__SLOTS__属性使用示例
2015/02/18 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
2019/09/02 Python
python基于FTP实现文件传输相关功能代码实例
2019/09/28 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
python中shell执行知识点
2020/05/06 Python
python实现二分类和多分类的ROC曲线教程
2020/06/15 Python
如何理解python对象
2020/06/21 Python
一款纯css3实现的颜色渐变按钮的代码教程
2014/11/12 HTML / CSS
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
HTML5在canvas中绘制复杂形状附效果截图
2014/06/23 HTML / CSS
美国知名的女性服饰品牌:LOFT(洛芙特)
2016/08/05 全球购物
美国转售二手商品的电子商务平台:BLINQ
2018/12/13 全球购物
西雅图的买手店:Totokaelo
2019/10/19 全球购物
公民授权委托书范本
2014/09/17 职场文书
2015年仓库管理工作总结
2015/05/25 职场文书
谢师宴学生答谢词
2015/09/30 职场文书
Python 实现定积分与二重定积分的操作
2021/05/26 Python
一次Mysql update sql不当引起的生产故障记录
2022/04/01 MySQL