从SQL Server表创建组合值字符串
我构建了一个SQL查询,返回以下结果:从SQL Server表创建组合值字符串,sql,reporting-services,Sql,Reporting Services,我构建了一个SQL查询,返回以下结果: ID Number ID IndexColumn String_To_Use Checking_ID 0000 1 0000 1 -2 1000 2 1000 2 -2 1020 3 1020 3 -2 1130 4 1130 4
ID Number ID IndexColumn String_To_Use Checking_ID
0000 1 0000 1 -2
1000 2 1000 2 -2
1020 3 1020 3 -2
1130 4 1130 4 -2
1198 5 NULL 9999 NULL NULL
1199 6 1199 5 -2
1210 7 1210 6 -2
1240 8 NULL 9999 NULL NULL
1250 9 NULL 9999 NULL NULL
1260 10 1260 7 7
1261 11 NULL 9999 NULL NULL
1280 12 NULL 9999 NULL NULL
1296 13 NULL 9999 NULL NULL
1298 14 NULL 9999 NULL NULL
1299 15 1299 8 8
1501 16 NULL 9999 NULL NULL
我需要用ID值填充列字符串_to_Use,如果检查_ID列的值为-2多次重复,则表示用户在某个范围内选择了ID,这些重复值将显示为0000-1130;如果没有重复值-2,例如1260。
基于此逻辑,上表将在字符串_To_Use列中包含以下值:
ID Number ID IndexColumn String_To_Use Checking_ID
0000 1 0000 1 0000-1130 -2
1000 2 1000 2 0000-1130 -2
1020 3 1020 3 0000-1130 -2
1130 4 1130 4 0000-1130 -2
1198 5 NULL 9999 NULL NULL
1199 6 1199 5 0000-1210 -2
1210 7 1210 6 0000-1210 -2
1240 8 NULL 9999 NULL NULL
1250 9 NULL 9999 NULL NULL
1260 10 1260 7 1260 7
1261 11 NULL 9999 NULL NULL
1280 12 NULL 9999 NULL NULL
1296 13 NULL 9999 NULL NULL
1298 14 NULL 9999 NULL NULL
1299 15 1299 8 1299 8
1501 16 NULL 9999 NULL NULL
谢谢 您需要定义相邻组。在这种情况下,您可以简单地对检查_id不是-2的次数进行累加 之后,剩下的是窗口函数和字符串操作:
select t.*,
(case when checking_id <> -2
then min(id) over (partition by grp) + '-' + max(id) over (partition by grp)
else id
end) as string_to_use
from (select t.*,
sum(case when checking_id <> -2 then 1 else 0 end) over (order by id) as grp
from t
) t;
此版本假定id是字符串。如果它是一个数字,则可以通过将代码与cast或convert混在一起来轻松调整代码。如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮{},以很好地格式化和语法突出显示它!你的数据库管理系统是什么?请@user10581977,我建议通过将外部图像替换为表格来编辑这个问题,可能需要以下帮助:因此这个问题在将来很有用,即使图像已关闭,也有助于提高可读性。此外,如果@gordon linoff回答这个问题,就像你的“谢谢”便条中所说的那样,请将答案标记为解决您问题的答案。谢谢。grp分区上的maxid给出了错误,这是一个非布尔类型的表达式,在预期条件的上下文中指定。到目前为止,使其部分工作的唯一方法是,如下所示:此答案是一个非常聪明和有用的答案,但并不完全正确,这里有一些注释:1在order by id上作为grp==>它给出了错误;2检查\u id-2==>它给出了不正确的结果,为了让逻辑工作,它需要检查\u id=-2。我已经用输出编辑了下面的答案。但是,即使进行这些更改,查询也需要一些额外的输入才能正常工作。能请人帮忙修理一下吗。谢谢字符串_To_使用列输出,但在范围内时仍不能提供正确的输出;正确的应该是:1前4行==>0000-1130;2第六行和第七行==>1199-1210
select t.*,
(case when Checking_id = -2
then min(id) over (partition by grp) + '-' + max(id) over (partition by grp)
else id
end) as string_to_use
from (select t.*
,sum(case when Checking_id = -2 then 1 else 0 end) over (partition by id) as grp
from t
) t order by id;
ID Number ID IndexColumn String_To_Use Checking_id grp string_to_use
0000 1 0000 1 -2 1 0000 -1210
1000 2 1000 2 -2 1 0000 -1210
1020 3 1020 3 -2 1 0000 -1210
1130 4 1130 4 -2 1 0000 -1210
1198 5 NULL 9999 NULL NULL 0 NULL
1199 6 1199 5 -2 1 0000 -1210
1210 7 1210 6 -2 1 0000 -1210
1240 8 NULL 9999 NULL NULL 0 NULL
1250 9 NULL 9999 NULL NULL 0 NULL
1260 10 1260 7 7 0 1260
1261 11 NULL 9999 NULL NULL 0 NULL
1280 12 NULL 9999 NULL NULL 0 NULL
1296 13 NULL 9999 NULL NULL 0 NULL
1298 14 NULL 9999 NULL NULL 0 NULL
1299 15 1299 8 8 0 1299
1501 16 NULL 9999 NULL NULL 0 NULL