依靠 JSON 数据的交叉应用
Count on CROSS APPLY with JSON Data
我有以下数据库结构:
ID、日期时间、JsonData
在 JsonData 中有一个名为 party 的字段,由“,”分隔,另一个字段名为 Source。
我正在尝试 运行 一个简单的 select 获取按(来源、时间)分组的数据...
日期时间、来源、SourceCount、CountParty
12/12/2021, 1, 4, 7
12/12/2021, 2, 3, 5
我正在尝试 运行 以下 SQL,但是,我很难获得 CountParty。我总是倾向于获取 SourceCount。任何人都可以阐明我做错了什么吗?
我总是以
结束
12/12/2021, 1, 4, 4
12/12/2021, 2, 3, 3
谢谢
select
json_value(JsonData,'$.Info.source') as Source
, Party.value
,count(json_value(JsonData,'$.Info.Party'))
, count(*)
from test
CROSS APPLY
STRING_SPLIT(json_value(JsonData,'$.Info.Party'), ',') Party
group by json_value(JsonData,'$.Info.Source'), value
order by [Source]
{ "cID": "CID1","Info": {"Party": "A,B,C","Source" : "1"}}
{ "cID": "CID2","Info": {"Party": "A, C","Source" : "2" }}
{ "cID": "CID3","Info": {"Party": "B, C","Source" : "2" }}
{ "cID": "CID4","Info": {"Party": "B","Source" : "1" }}
{ "cID": "CID5","Info": {"Party": "C,A","Source" : "1" }}
{ "cID": "CID6","Info": {"Party": "A","Source" : "1" }}
{ "cID": "CID7","Info": {"Party": "C","Source" : "2" }}
select
json_value(JsonData,'$.Info.source') as Source
, Party.value
,count(json_value(JsonData,'$.Info.Party'))
, count(*)
from test
CROSS APPLY
STRING_SPLIT(json_value(JsonData,'$.Info.Party'), ',') Party
group by json_value(JsonData,'$.Info.Source'), value
order by [Source]
你的问题是因为你也是按 value
分组的,它指的是 STRING_SPLIT
中的 value
。因此,您会为每个单独的拆分 party
值获得一个新组。您应该将其从分组中删除。相反,您可以在子查询中获取 Party
个值的计数,然后是 SUM
个。
另请注意,count(json_value(JsonData,'$.Info.Party'))
不计算不同的值,它计算有多少个非空值,这可能不是您的意图。
您也可以使用 OPENJSON
一次提取所有值,而不是一次又一次地使用 JSON_VALUE
。
SELECT
t.Datetime,
j.Source,
COUNT(*) SourceCount,
SUM(p.PartyCount) PartyCount
FROM test t
CROSS APPLY
OPENJSON(t.JsonData, '$.Info')
WITH (
Party nvarchar(500),
Source nvarchar(100)
) j
CROSS APPLY (
SELECT COUNT(*) PartyCount
FROM STRING_SPLIT(j.Party, ',')
) p
group by
t.Datetime,
j.Source
order by
j.Source;
我有以下数据库结构:
ID、日期时间、JsonData
在 JsonData 中有一个名为 party 的字段,由“,”分隔,另一个字段名为 Source。
我正在尝试 运行 一个简单的 select 获取按(来源、时间)分组的数据...
日期时间、来源、SourceCount、CountParty
12/12/2021, 1, 4, 7
12/12/2021, 2, 3, 5
我正在尝试 运行 以下 SQL,但是,我很难获得 CountParty。我总是倾向于获取 SourceCount。任何人都可以阐明我做错了什么吗?
我总是以
结束12/12/2021, 1, 4, 4
12/12/2021, 2, 3, 3
谢谢
select
json_value(JsonData,'$.Info.source') as Source
, Party.value
,count(json_value(JsonData,'$.Info.Party'))
, count(*)
from test
CROSS APPLY
STRING_SPLIT(json_value(JsonData,'$.Info.Party'), ',') Party
group by json_value(JsonData,'$.Info.Source'), value
order by [Source]
{ "cID": "CID1","Info": {"Party": "A,B,C","Source" : "1"}}
{ "cID": "CID2","Info": {"Party": "A, C","Source" : "2" }}
{ "cID": "CID3","Info": {"Party": "B, C","Source" : "2" }}
{ "cID": "CID4","Info": {"Party": "B","Source" : "1" }}
{ "cID": "CID5","Info": {"Party": "C,A","Source" : "1" }}
{ "cID": "CID6","Info": {"Party": "A","Source" : "1" }}
{ "cID": "CID7","Info": {"Party": "C","Source" : "2" }}
select
json_value(JsonData,'$.Info.source') as Source
, Party.value
,count(json_value(JsonData,'$.Info.Party'))
, count(*)
from test
CROSS APPLY
STRING_SPLIT(json_value(JsonData,'$.Info.Party'), ',') Party
group by json_value(JsonData,'$.Info.Source'), value
order by [Source]
你的问题是因为你也是按 value
分组的,它指的是 STRING_SPLIT
中的 value
。因此,您会为每个单独的拆分 party
值获得一个新组。您应该将其从分组中删除。相反,您可以在子查询中获取 Party
个值的计数,然后是 SUM
个。
另请注意,count(json_value(JsonData,'$.Info.Party'))
不计算不同的值,它计算有多少个非空值,这可能不是您的意图。
您也可以使用 OPENJSON
一次提取所有值,而不是一次又一次地使用 JSON_VALUE
。
SELECT
t.Datetime,
j.Source,
COUNT(*) SourceCount,
SUM(p.PartyCount) PartyCount
FROM test t
CROSS APPLY
OPENJSON(t.JsonData, '$.Info')
WITH (
Party nvarchar(500),
Source nvarchar(100)
) j
CROSS APPLY (
SELECT COUNT(*) PartyCount
FROM STRING_SPLIT(j.Party, ',')
) p
group by
t.Datetime,
j.Source
order by
j.Source;