基于列中的文本在SQL Server表中不同行的多列中执行添加

基于列中的文本在SQL Server表中不同行的多列中执行添加,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我试图找到一个查询,它根据同一表中其他列中的文本/数据,对不同行和不同列中的数据执行一些加减操作 下面的例子可以清楚地解决这个问题 考虑一下,我有一个名为的表,它有四个字段/列,有几个记录,如下所示 Product Term Bid Offer ------------------------------ A Aug14 P Q A/B Aug14 R S B Aug14 X Y B

我试图找到一个查询,它根据同一表中其他列中的文本/数据,对不同行和不同列中的数据执行一些加减操作

下面的例子可以清楚地解决这个问题

考虑一下,我有一个名为
的表,它有四个
字段/列
,有几个记录,如下所示

Product    Term    Bid   Offer
------------------------------
A          Aug14   P      Q
A/B        Aug14   R      S
B          Aug14   X      Y
B          Sep14   ab     xy
B/C        Sep14   pq     rs
C          Sep14   wx     yz
Product    Term    Bid   Offer
------------------------------
A          Aug14   a      b
B          Aug14   c      d
B          Sep14   ab     cd
C          Sep14   abc    cde
当我运行查询时,它应该查找由
/
分隔的产品。在上述情况下,有两种类型的产品
A/B和B/C
,然后它应该根据由
/
分隔的产品查找单个产品,就像我们有一个由A/B
分隔的产品一样
/
,因此它应该查找与
A/B
具有相同术语的
产品A和B
,并执行一些操作并返回以下数据

Product    Term    Bid   Offer
------------------------------
A          Aug14   P      Q
A/B        Aug14   R      S
B          Aug14   X      Y
B          Sep14   ab     xy
B/C        Sep14   pq     rs
C          Sep14   wx     yz
Product    Term    Bid   Offer
------------------------------
A          Aug14   a      b
B          Aug14   c      d
B          Sep14   ab     cd
C          Sep14   abc    cde
在上述结果中

a=R+Y  b=S+X  
c=Q-S  d=P-R
其中,
p、Q、R、S、X、Y
是表中的
Bid
Offer

类似的计算也适用于所有其他数据,如
B/C Sep14..
和许多其他数据

范例

直截了当

A   Oct14  -175 -75
B   Oct14   125  215
A/B Oct14   NULL -150
结果应该是

A Oct14  NULL          -150+125=-25
B Oct14  -75-(-150)=75  NULL
使用前面提到的方程式计算上述值
我可以知道在SQL Server 2012中解决此问题的更好方法吗?

好,让我们创建一些测试数据:

DECLARE @Outright TABLE
(
    Product VARCHAR(10),
    Term VARCHAR(10),
    Bid VARCHAR(10),
    Offer VARCHAR(10)
)

INSERT INTO @Outright
VALUES
('A',  'Aug14','P','Q'),
('A/B','Aug14','R','S'),
('B',  'Aug14','X','Y');
制作一个cte,尝试找出上面发布的逻辑,并将单个产品线与多个产品线相匹配

;WITH t AS
(
    SELECT 
        a.*, 
        d.DRN, 
        d.Bid dBid, 
        d.Product dProduct, 
        d.Offer dOffer,
        ROW_NUMBER() OVER (ORDER BY a.Product) RN
    FROM @Outright a
    OUTER APPLY
    (
        SELECT *,
            ROW_NUMBER() OVER (ORDER BY d.Product) DRN
        FROM @Outright d
        WHERE d.Product LIKE (a.Product + '/%')
            OR d.Product LIKE ('%/' + a.Product)
    ) d
    WHERE d.Product IS NOT NULL
)
现在我们尝试实现上面提到的+-规则(出价对出价、出价对出价等)

这是输出,有一些额外的列显示正在提取的数据

Prod1   Term1   FE1_1   FE1_2   FE2_1   FE2_2   RN  Col1    Col2
A   Aug14   R   Y   S   X   1   R+Y S+X
B   Aug14   Q   S   P   R   2   Q-S P-R

我建议你先规范化你的表。我认为它已经被规范化了。你认为一列中有两个值,a/B,是规范化的吗?哎哟,在我的例子中,这只是一个单一的值,它与单个值a无关,我们的结果与显示的数据不匹配,D=P-R来自哪里?你为什么要加减一些?看起来您正在将多个产品、多个出价和多个报价放在一行中,这远远不是标准化的。从您的第二个表中,当没有报价使用这些值时,报价b、d、cd、cde从第一个表中出现在哪里。在询问是否可以做任何事情之前,您可能应该先清理一下您的示例,因为您的示例没有任何押韵或理由。可能还需要将术语放在where子句中,以便处理每个单独的日期,我将留给您作为练习。您还需要在该行中按术语进行划分,并对每个联合按术语进行分组:)我只是使用这些P、Q、R等作为实际值的符号。我用一个真实的例子编辑了这个问题。请看我上面提到的两个修复之外(我是输出文本而不是计算),逻辑对你有用吗?