sql - 在 SQL Server 中使用 JSON 数组代替传统的关系数据库,每个值在 1 行中
问题描述
我已将答案值按行保存在表格中,在此示例中,1 个答案 1 行,5 行。如果我将它迁移到 JSON 它将是 2 行(JSON)
桌子
ID | 选项ID | PID | 柱子 |
---|---|---|---|
1 | 2 | 1 | 无效的 |
2 | 1 | 2 | 无效的 |
3 | 1 | 2 | 无效的 |
4 | 2 | 2 | 无效的 |
5 | 3 | 1 | 无效的 |
我想计算每个Optionsid有多少个答案(pid)
SELECT COUNT(pid)AS Counted, OptionsId
FROM Answer GROUP BY [Column], OptionsId
表结果
计数 | 选项ID |
---|---|
2 | 1 |
2 | 2 |
1 | 3 |
我已经运行了查询并将其保存在一个新表中
select * from Answer for Json Auto
Json 表 我将 {"answer":} 添加到 Json
ID | PID | json |
---|---|---|
1 | 1 | {"答案":[{"Id":1,"Optionsid":2,"Pid":1}]} |
2 | 2 | {"Answer":[{"Id":2,"Optionsid":1,"Pid":2},{"Id":2,"Optionsid":1,"Pid":2},{"Id" :3,"Optionsid":2,"Pid":2},{"Id":4,"Optionsid":3,"Pid":2}]} |
我想从Json 表中得到与上面的表结果相同的结果,但我可以让它工作这个查询只取数组中的第一个 [0],我想要一个取数组中所有值的查询。有人可以帮我解决这个问题吗?
Select Count(Json_value ([json], '$.Answer[0].Pid')) as Counted,
Json_value ([json], '$.Answer[0].Optionsid') as OptionsId
from [PidJson]
group by Json_value ([json],'$.Answer[0].Column'),Json_value
([json],'$.Answer[0].Optionsid')
如果您想看,这是一个小提琴
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=0a2df33717a3917bae699ea3983b70b4
解决方案
这是解决方案
SELECT Count(JsonData.Pid) as Counted,
JsonData.Optionsid
FROM PidJson AS RelationsTab
CROSS APPLY OPENJSON (RelationsTab.json,
N'$.Answer')
WITH (
Pid VARCHAR(200) N'$.Pid',
Optionsid VARCHAR(200) N'$.Optionsid',
ColumnValue INT N'$.Column'
) AS JsonData
Group by JsonData.ColumnValue, JsonData.Optionsid
感谢您的时间,您“强迫”我澄清我的问题,我找到了解决方案
推荐阅读
- python - 没有频率熊猫数据框,无法将积分值添加到时间戳
- python - 评分前的后处理交叉验证预测
- ms-access - MS Access 使用哪种列数据类型来保存 Base64 图像?
- batch-file - 执行 bat 文件时出现“意外”错误
- python - 分组后多列上的python操作
- java - 动态注册bean和普通bean的区别
- plotly - 使用python的圆形网络图布局
- python - 没有名为“请求”的模块加上终端中的请求错误
- php - 将 PHP 变量传递给 Json
- java - java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.TableRow.addView(android.view.View)”