列的值相互连接

时间:2019-06-24 12:08:13

标签: sql sql-server tsql

我有一列产品。在SQL Server的表列中,有两种类别(作为修饰符的主要产品和副产品)。我在这里将主要产品表示为P,将修饰符表示为M。我有一个交易级别的数据,其中客户在一次交易中购买了多个带有修饰符的产品。对于单个产品,可以有多个修改器。仅供参考。

Sr No.    Products
1            P1
2            M1
3            M2
4            M3
5            P11
6            M11

现在,我要映射带有修饰符的产品。每个修饰符都属于该列上方的产品。我需要的输出就像。

Product   Modifiers
P1          M1
P1          M2
P1          M3
P11         M11

我已经使用while循环在sql server中编写了逻辑。但是实现逻辑要花费很多时间。而在我的桌子上,我的记录大约超过一千万。谁能帮我找到实现上述情况逻辑的有效方法。

2 个答案:

答案 0 :(得分:0)

这看起来很棘手,但是您可以使用产品的累计总和来分配组,然后将产品分配给该组中的所有产品:

select product, modifer
from (select max(case when product like 'P%' then product end) over (partition by grp) as product,
             product as modifier
      from (select t.*,
                   max(case when product like 'P%' then sr_no end) over (order by id) as grp
            from t
           ) t
     ) t
where modifier not like 'P%';

答案 1 :(得分:0)

与Gordon的解决方案略有不同。

注意::这假设每个产品都至少具有一个修饰符。

示例

Select *
 From  (
        Select Product = max(case when Products like 'P%' then Products end) over (Order by [Sr No.] )
              ,Modifiers = Products
         From YourTable
       ) A 
 Where Modifiers <> Product

返回

Product Modifiers
P1      M1
P1      M2
P1      M3
P11     M11