在 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代理的安装