如何查询以获取列表中某个日期范围内每个名称的数据



我有一个类似的表

日期
名称 总计
A 10 2020-12-01
B 5 2020-12-01
A 10 2020-12-02
B 15 2020-12-02

JSON方法怎么样?

假设名称和日期从不包含双引号,则可以将它们转换为具有字符串函数的JSON字符串,并使用openjson()将每个列表取消为行。最后一步是将left join带到原始表中。

declare @NameList nvarchar(max) = '[A],[B],[C],[D]';
declare @DateList nvarchar(max) =  '[2020-12-01],[2020-12-02],[2020-12-03],[2020-12-04]';
select n.name, coalesce(t.total, 0) as total, d.dt 
from openjson('[' + replace(replace(@NameList, '[', '"'), ']', '"') + ']') 
with(name nvarchar(max) '$') n
cross join openjson('[' + replace(replace(@DateList, '[', '"'), ']', '"') + ']') 
with(dt date '$') d
left join mytable t on t.name = n.name and t.date = d.dt

您可以使用string_split()分解列表,然后使用left join引入现有数据:

declare @NameList nvarchar(max) = '[A],[B],[C],[D]';
declare @DateList nvarchar(max) =  '[2020-12-01],[2020-12-02],[2020-12-03],[2020-12-04]';
select v.name, v.date, coalesce(t.total, 0) as total
from string_split(@namelist, ',') n cross join
string_split(@datelist, ',') d cross apply
(values (replace(replace(n.value, '[', ''), ']', ''),  
convert(date, replace(replace(d.value, '[', ''), ']', ''))
)
) v(name, date) left join
yourtable t
on t.name = v.name and t.date = v.date

这里唯一真正的技巧是使用apply来移除方括号。

这里有一个db<gt;不停摆弄

使用此

select t1.name,t2.[date]  from 
[table] t1
cross apply [table] t2

相关内容

  • 没有找到相关文章

最新更新