相关文章推荐
傻傻的针织衫  ·  Java ...·  23 小时前    · 
不拘小节的酸菜鱼  ·  Ubuntu 19,10 ...·  3 月前    · 
激动的烤地瓜  ·  Project ...·  4 月前    · 
曾深爱过的毛衣  ·  Talk | ...·  4 月前    · 
含蓄的汽水  ·  Element ...·  1 年前    · 

在[Q1_Answer]、[Q2_Answer]、[Q3_Answer]中记录的数据格式是JSON文档内容,因为是选项值,而且考虑到可能有多选, 所以存储的格式如下:

1 [ 
{"code":"a", "desc":"Jan."},
{"code":"b", "desc":"Feb."}
]

其中 code 表示选项, desc 表示选项的文字描述。

现在,用户想用PowerBI 来实现对结果的统计。有如下几个问题:

  • 在Power BI中,无法直接从JSON数据中读取到选项值
  • 如果是多选,又该如何处理。
  • 比较适合分析的数据结构应该长这样:

    注意,上述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())

    数据内容:

    select a.username, a.T, a.answers, a.dt from dbo.T_Questionaire a unpivot ( answers for T in (t1,t2,t3 )) 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

    查询结果如下: