gpt4 book ai didi

SQL Server - 分组依据 - 附加列

转载 作者:行者123 更新时间:2023-12-04 20:19:35 28 4
gpt4 key购买 nike

我有一个问题,我几乎无法用语言表达,因此在创建这篇文章之前无法搜索解决方案。如果之前有人问过这个问题,请原谅我。让我说明输入和期望的输出:

Order    Description    Operation    OperationDescription    SubTarget
12 Order12 Op1 Order12, Op1 ABA
12 Order12 Op2 Order12, Op2 ABB
18 Order18 Op1 Order18, Op1 XYA
18 Order18 Op2 Order18, Op2 XYB
19 Order19 Op1 Order19, Op1 KLA
20 Order20 Op1 Order20, Op1 Truck123
20 Order20 Op2 Order20, Op2 Truck456
20 Order20 Op3 Order20, Op3 Truck789
20 Order20 Op4 Order20, Op4 Truck123

当我查询上面的表格并按顺序和描述分组时,我想从 SubTarget 获取所有字符(从左到写),只要它们匹配(并丢弃其余的):
Order    Description    SubTarget
12 Order12 AB
18 Order18 XY
19 Order19 KLA
20 Order20 Truck

我曾经在网上找到了一些简洁的代码,可以使用 STUFF 和 FOR XML PATH 从不在 group by 子句中的列中连接不同的值。不确定这种方法在这里是否也有帮助。

谢谢大家!

问候,
托比

附加说明,基于@junkatsu 的评论和回答:
后台有一列Target,无法访问。它的内容始终是 SubTarget 的一个分区——反之亦然:SubTarget 通过在字符串末尾添加更多字符来进一步向 Target 添加一些细节。也就是说,两个值分别不限于两个或三个字符。如果是这样,我可以轻松地使用子字符串函数。

第三个示例(Order# 19)可能会令人困惑。我包含了这个示例,以便表明如果订单中只有一个操作,那么整个字符串都可以。
另一个例子可能是:Order 5 with Operation Op1、Op2、Op3 和 SubTarget Truck123、Truck456、Truck789 和 Truck 123。这应该产生“卡车”作为结果。 Truck123 的重复是没有错误的。
希望这能让它更清楚。
最后我想接近 Target 列的实际内容,因为它不能包含在查询中。

再次感谢,
托比

最佳答案

我无法理解您的 附加说明和第三个示例(订单号 19)。我只是为你预期的答案而工作,

create table #group (Orders int,Description varchar (20),Operation varchar (20)
,OperationDescription varchar (20),SubTarget varchar (20)
)

insert into #group values
(20,'Order20','Op1','Order20, Op1','Truck123')
,(20,'Order20','Op2','Order20, Op2','Truck456')
,(20,'Order20','Op3','Order20, Op3','Truck789')
,(20,'Order20','Op4','Order20, Op4','Truck123')
,(12,'Order12','Op1','Order12 Op1','ABA')
,(12,'Order12','Op2','Order12 Op2','ABB')
,(18,'Order18','Op1','Order18 Op1','XYA')
,(18,'Order18','Op2','Order18 Op2','XYB')
,(19,'Order19','Op1','Order19 Op1','KLA')

select distinct
gor.Orders, gor.Description, iif (g.c = 1, gor.SubTarget
, left (gor.subtarget, 2)) subtraget
from (
select distinct
orders, Description
, count (*) c
from #group group by orders, Description
) g join #group gor on g.Orders = gor.Orders

我得到了:
Orders      Description     subtraget
12 Order12 AB
18 Order18 XY
19 Order19 KLA
20 Order20 Tr

如果查询需要更新,请回复我。

更新 1 查找更新的查询。
select distinct
orders, Description, Operation, OperationDescription
, iif (count (*) over (partition by orders, Description ) = 1, subtarget,
left (subtarget, 2)
) subtarget
from #group

更新 2

1)。 cte :首先我取所有子目标的子字符串。

例如:Truck123->Truck12->Truck1->......->Tr。

2)。 countlen :我计算 cte 中的模式并获得最大长度。因为,基本字符串来了很多次。

例如:卡车比 Trunck123、Trunck456、Trunck789、Trunck123 来得更频繁。

并且卡车长度大于Tr,Tru,Truc。

3)。 maxcount :我得到最大计数,由 countlen 返回

4)。最后我在没有子目标的情况下加入了 cte 以上。然后从 cte 得到。
;with cte as ( 
select Orders, Description, SubTarget, len (SubTarget) len from #group
union all
select Orders, Description, left (subtarget, len (SubTarget) - 1)
, LEN (SubTarget) - 1 from cte where len > 2
), countlen as (
select
Orders, Description, SubTarget
, count (len) over (partition by Orders, Description, SubTarget order by len) count
, max (len) over (partition by Orders, Description, SubTarget order by len) maxlen
from cte
), maxcount as (
select Orders, Description, max (count) maxcount from countlen group by Orders, Description
) select distinct
o.Orders, o.Description, c.SubTarget
from (
select
cc.Orders, cc.Description, max (cc.maxlen) maxofmax
from countlen cc
join maxcount m
on cc.Orders = m.Orders and cc.Description = m.Description
where m.maxcount = cc.count
group by cc.Orders, cc.Description
) o
join cte c
on o.Orders = c.Orders and o.Description = c.Description and len (c.SubTarget) = o.maxofmax

关于SQL Server - 分组依据 - 附加列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53502642/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com