解析 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