我有一个类似的表
名称 | 总计 | 日期|
---|---|---|
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