如何在报表中统计JSON格式存储的数据
Admin 2022-08-04 群英技术资讯 495 次浏览
近日在项目中遇到一个问题: 如何在报表中统计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 来实现对结果的统计。有如下几个问题:
比较适合分析的数据结构应该长这样:
行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())
数据内容:
创建转换视图:
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
查询结果如下:
总结下解决的思路:
1 先用unpivot将列行转换, 使横表记录变成纵表记录
2 使用openjson 将json数据转换为集合数据, 然后使用cross apply 将集合展开
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本文详细讲解了SQL Server中聚合函数的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
一般,我们建立数据库表时,表数据都存放在一个文件,而对表做分区之后,就可以把一个数据文件拆分到多个数据文件中,这样有利于数据操作和提高效率。对于大量数据的数据表,我们做分区是有必要的,为了提高SQL的执行效率,做SQL优化也很重要的。
前言上一篇我们研究了如何利用索引在数据库里面调优,简要的介绍了索引的原理,更重要的分析了如何选择索引以及索引的利弊项,有兴趣的可以点击查看。本篇延续上一篇的...
这篇文章主要介绍了SQL Server授予了CREATE TABLE权限但是无法创建表的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
SQL数据库增删改查语法:1、【SELECT * FROM table_name】;2、【INSERT INTO table_name VALUES (value1,value2,value3,...)】。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008