一个SQLServer中JSON文档型数据的查询问题「建议收藏」

一个SQLServer中JSON文档型数据的查询问题「建议收藏」本文以“问卷调查统计”为案例,介绍了JSON文档型数据在SQL Server中如何做分析处理,主要使用到了Unpivot和OpenJSON

一个SQLServer中JSON文档型数据的查询问题

近日在项目中遇到一个问题: 如何在报表中统计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 将集合展开

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/6065.html

(0)
上一篇 2023-04-18 10:30
下一篇 2023-04-18 11:30

相关推荐

  • 【赵强老师】史上最详细的PostgreSQL体系架构介绍

    【赵强老师】史上最详细的PostgreSQL体系架构介绍PostgreSQL是最像Oracle的开源数据库,我们可以拿Oracle来比较学习它的体系结构,比较容易理解。PostgreSQL的主要结构如下: 一、存储结构 PG数据存储结构分为:逻辑存储结构和

    2023-04-22
    148
  • Python中if和elseif语句的区别

    Python中if和elseif语句的区别在Python中,if和elseif是两种常用的条件语句。它们可以根据不同的条件执行不同的代码块。具体来说,if语句是用来判断一个条件是否成立,如果成立就执行对应的代码块;如果不成立,可以选择执行其他代码或者什么也不做。而elseif语句则是可以在if语句执行不成立时继续判断下一个条件是否成立,如果成立就执行对应的代码块。

    2024-07-10
    46
  • 如何在Windows 10中添加环境变量

    如何在Windows 10中添加环境变量环境变量是Windows操作系统中重要的配置,它定义了操作系统和其他应用程序在运行时需要用到的路径、选项和参数。在Windows 10中添加环境变量并配置正确可以使你的计算机更高效地运行。

    2024-04-17
    68
  • 如何干涉MySQL优化器使用hash join[亲测有效]

    如何干涉MySQL优化器使用hash join[亲测有效]GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。 前言 实验 总结 前言 数据库的优化器相当于人类的大

    2023-06-05
    136
  • Python os.mkdir递归创建文件夹实现

    Python os.mkdir递归创建文件夹实现在使用Python编写程序时,我们经常需要创建文件夹以存储数据。Python的os模块提供了两种方法来创建文件夹:os.mkdir和os.makedirs。那么这两种方法有什么区别?

    2024-03-27
    72
  • PyCharm中文乱码问题

    PyCharm中文乱码问题Python是一种广泛使用的编程语言,而PyCharm则是专门为Python开发者设计的一款集成开发环境。PyCharm功能强大,操作简单,被众多Python开发者所推崇使用。

    2024-08-21
    27
  • Python中常用的列表操作

    Python中常用的列表操作a href=”https://www.python100.com/a/sm.html”font color=”red”免责声明/font/a a href=”https://beian.miit.gov.cn/”苏ICP备2023018380号-1/a Copyright www.python100.com .Some Rights Reserved.

    2023-12-13
    120
  • sql创建数据库语句_数据库建表语句

    sql创建数据库语句_数据库建表语句本文介绍如何使用 SQL INSERT 语句将数据插入到表中,如何用 INSERT SELECT 从其他表中导入行,如何用 SELECT INTO 将行导出到一个新表。 一、数据插入 毫无疑问,SEL

    2023-05-18
    155

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注