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中交叉联接的用法详解
Apr 22 SQL Server
Windows环境下实现批量执行Sql文件
Oct 05 SQL Server
SQL Server2019数据库备份与还原脚本,数据库可批量备份
Nov 20 SQL Server
SQLServer RANK() 排名函数的使用
Mar 23 SQL Server
SQL Server使用导出向导功能
Apr 08 SQL Server
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
Apr 22 SQL Server
SQL Server 中的事务介绍
May 20 SQL Server
SQL SERVER中的流程控制语句
May 25 SQL Server
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
May 25 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
WIN98下Apache1.3.14+PHP4.0.4的安装
2006/10/09 PHP
PHP多文件上传类实例
2015/03/07 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
关于PHP文件的自动运行方法分析
2016/05/13 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
用js实现随机返回数组的一个元素
2007/08/13 Javascript
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
jQuery.extend 函数详解
2012/02/03 Javascript
用jquery.sortElements实现table排序
2014/05/04 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
2014/12/20 Javascript
js实现的倒计时按钮实例
2015/06/24 Javascript
简单对比分析JavaScript中的apply,call与this的使用
2015/12/04 Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
2016/05/24 Javascript
angular中的cookie读写方法
2017/08/02 Javascript
node结合swig渲染摸板的方法
2018/04/11 Javascript
详解Angular6 热加载配置方案
2018/08/18 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
JS立即执行函数功能与用法分析
2019/01/15 Javascript
vue element upload实现图片本地预览
2019/08/20 Javascript
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
2020/09/28 Javascript
python 远程统计文件代码分享
2015/05/14 Python
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
使用python 打开文件并做匹配处理的实例
2019/01/02 Python
python异步存储数据详解
2019/03/19 Python
PyCharm2019安装教程及其使用(图文教程)
2019/09/29 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
2020/03/10 Python
波兰购物网站:MALL.PL
2019/05/01 全球购物
工程概预算专业毕业生求职信
2013/10/04 职场文书
干部考核评语
2014/04/29 职场文书
2014组织生活会方案
2014/05/19 职场文书
2014年化验员工作总结
2014/11/18 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
2015年推普周活动方案
2015/05/06 职场文书
资深HR教你写好简历中的自我评价
2019/05/07 职场文书
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers