在 SQL Server 2008R2 中解析 Json 并计算值

Posted

技术标签:

【中文标题】在 SQL Server 2008R2 中解析 Json 并计算值【英文标题】:Parse Json and calculate values in SQL Server 2008R2 【发布时间】:2017-12-26 14:02:08 【问题描述】:

我使用的是 SQL Server 2008 R2 版本。我有一个名为出勤的表,它具有以下值:

Id   Date         Status
1    2017-12-20   ["id":1,"Status":"Available","id":2,"Status":"Sick Leave","id":3,"Status":"Available","id":4,"Status":"Available"]
2    2017-12-21   ["id":1,"Status":"Sick Leave","id":2,"Status":"Casual Leave","id":3,"Status":"Available","id":4,"Status":"Available"]

我需要的是

Date        Available   SickLeave  CasualLeave  Morning Permission Evening Permission 
2017-12-20    3           1           0               0               0
2017-12-21    3           1           1               0               0

我真的被困住了。有人可以帮我解决这个问题吗?

提前致谢

【问题讨论】:

【参考方案1】:

我会使用带有一些简单条件聚合的 xml .node() 方法

select 
    a.[Date],
    sum(case when substring(s.value('.', 'varchar(100)'), 1, charindex('"', s.value('.', 'varchar(100)'))-1) = 'Available' then 1 else 0 end) [Available],
    sum(case when substring(s.value('.', 'varchar(100)'), 1, charindex('"', s.value('.', 'varchar(100)'))-1) = 'Sick Leave' then 1 else 0 end) [SickLeave],
    sum(case when substring(s.value('.', 'varchar(100)'), 1, charindex('"', s.value('.', 'varchar(100)'))-1) = 'Casual Leave' then 1 else 0 end) [CasualLeave],
    sum(case when substring(s.value('.', 'varchar(100)'), 1, charindex('"', s.value('.', 'varchar(100)'))-1) = 'Morning Permission' then 1 else 0 end) [MorningPermission],
    sum(case when substring(s.value('.', 'varchar(100)'), 1, charindex('"', s.value('.', 'varchar(100)'))-1) = 'Evening Permission' then 1 else 0 end) [EveningPermission]   from
(
    select Id, [Date], cast('<m>'+replace([Status], '":"','</m><m>')+'</m>' as xml) [Status] from Attendance
) a cross apply [Status].nodes ('/m') as aa(s)
group by a.[Date]

结果:

Date        Available   SickLeave  CasualLeave  MorningPermission EveningPermission 
2017-12-20    3           1           0               0               0
2017-12-21    2           1           1               0               0

【讨论】:

非常感谢。让我尝试一下并更新发生的情况。

以上是关于在 SQL Server 2008R2 中解析 Json 并计算值的主要内容,如果未能解决你的问题,请参考以下文章

sql server 2008r2默认实例名登录(服务器)时应该怎么写?

如何在SQL Server 2008R2中查找未使用的列

在完整版的sql server 2008R2上禁用SQL Server代理的安装

SQL Server 2008r2 提交性能问题

SQL Server 2008R2数据库文件导入到SQL Server 2008数据库中

如何在 sql server 2008r2 中将行名更改为列名