在sql语句中创建包
我需要在零件id上创建一个包。对于每个包P1、P2、P3,。。。 如果P1中有一个true,那么我需要在package_代码中包含该代码,如图所示,在sql语句中进行描述时也是如此在sql语句中创建包,sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要在零件id上创建一个包。对于每个包P1、P2、P3,。。。 如果P1中有一个true,那么我需要在package_代码中包含该代码,如图所示,在sql语句中进行描述时也是如此 Part_id code Code_description P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 P13 P14 P15 85
Part_id code Code_description P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 P13 P14 P15
85 19 D1 TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
85 34 D2 TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
85 CS D3 TRUE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
85 EP D4 TRUE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
85 MS D5 TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
85 XR D6 TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
85 BU D7 TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
Packages Part_id Package_code Package_description
P1 85 19| 34| CS | EP | MS |XR |BU D1 | D2 | D3| D4 |D5|D6 |D7
P2 85 19|34|BU D1| D2 | D7
P3 85 CS|EP D3 | D4
首先,这是一个糟糕的桌子设计,但我假设你无法控制它 获得所需结果的第一步是取消p列的分割,以便将它们作为行处理(我只转到P4,其余部分由您填写)。我把结果输入CTE
with CTE(Part_id, code, Code_description, Package, Included) as
(
select Part_id, code, Code_description, Package, Included
from Part p
unpivot
(Included for Package in (P1, P2, P3, P4)) unpvt
)
下一个技巧是从CTE行中创建一个带分隔符的代码列表(基于包含的字段)。就是这样做的:
STUFF((select ' | ' + c2.code from cte c2 where c2.Package = c.Package and c2.Part_id = c.Part_id and c2.Included = 1 order by c2.Code_description for XML PATH('')), 1, 3, '')
是的,这很难看,但SQL Server并不是真正设计用来做这种事情的
最后的查询如下所示
select distinct c.Package,
c.Part_id,
STUFF((select ' | ' + c2.code from cte c2 where c2.Package = c.Package and c2.Part_id = c.Part_id and c2.Included = 1 order by c2.Code_description for XML PATH('')), 1, 3, '') Package_code,
STUFF((select ' | ' + c2.Code_description from cte c2 where c2.Package = c.Package and c2.Part_id = c.Part_id and c2.Included = 1 order by c2.Code_description for XML PATH('')), 1, 3, '') Package_description
from cte c
这里有一个