在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

我需要在零件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      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
这里有一个