解析 Json 并计算 SQL Server 2008R2 中的值
Parse Json and calculate values in SQL Server 2008R2
我正在使用 SQL Server 2008 R2 版本。我有一个名为 Attendance 的 table,它具有以下值:
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
我真的卡住了。有人可以帮我解决这个问题吗?
提前致谢
我会使用 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 2008 R2 版本。我有一个名为 Attendance 的 table,它具有以下值:
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
我真的卡住了。有人可以帮我解决这个问题吗?
提前致谢
我会使用 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