如何在SQL中基于字符串分组分配值?

时间:2020-05-01 00:09:36

标签: sql sql-server list grouping

我有SQL会计数据。这些是要进行销售的分录,因此,每进行一次销售都会有一个商品成本抵销分录。当客户购买相同的产品但数量不同时,它将具有相同的备注行,只是销售和商品成本的金额不同。在我们使用的会计系统中,由于某种我不知道的原因,它仅在销售行中自动为TxnId列生成交易ID,而不是为销售行的成本生成交易ID。我使用以下查询提取数据:

SELECT
    account,
    name, 
    memo, 
    debit,
    credit,
    amount,
    txnid,
    refnum,
    ROW_NUMBER() OVER (PARTITION BY memo, refnumber ORDER BY account,memo,abs(amount)) AS memo_group 
FROM [dbo].[Table] 
WHERE refnumber = '67175'

结果表如下:

  Account                Name       Memo           Debit    Credit   Amount   TxnID      RefNum    Row_Counter 
Sales                Company A    Wingding 1     Null     855       855    5EASUC-X    12345        1
Sales                Company A    Wingding 1     Null     400       400    5EASUC-X    12345        2
CostofGoodsSold      Company A    Wingding 1     -650     Null     -650    Null        12345        3
CostofGoodsSold      Company A    Wingding 1     -200     Null     -200    Null        12345        4
Sales                Company A    Wingding 2     Null     760       760    5EASUC-X    12345        1
Sales                Company A    Wingding 2     Null     665       665    5EASUC-X    12345        2
CostofGoodsSold      Company A    Wingding 2     -600     Null     -600    Null        12345        3
CostofGoodsSold      Company A    Wingding 2     -465     Null     -465    Null        12345        4

我想做的是将销售行中的贷方金额分配给另一列中相应的销售商品成本,同时保持销售行的金额不变。我希望得到一个像这样的表:

    Account                Name       Memo           Debit    Credit   Amount   TxnID      RefNum    Row_Counter   New_Col
    Sales                Company A    Wingding 1     Null     855       855    5EASUC-X    12345        1         855
    Sales                Company A    Wingding 1     Null     400       400    5EASUC-X    12345        2         400
    CostofGoodsSold      Company A    Wingding 1     -650     Null     -650    Null        12345        3         855
    CostofGoodsSold      Company A    Wingding 1     -200     Null     -200    Null        12345        4         400
    Sales                Company A    Wingding 2     Null     760       760    5EASUC-X    12345        1         760
    Sales                Company A    Wingding 2     Null     665       665    5EASUC-X    12345        2         665
    CostofGoodsSold      Company A    Wingding 2     -600     Null     -600    Null        12345        3         760
    CostofGoodsSold      Company A    Wingding 2     -465     Null     -465    Null        12345        4         665

我尝试使用Windows函数来执行此操作,但是没有任何运气。有人对此有任何建议吗?

1 个答案:

答案 0 :(得分:0)

您将结合使用CTE和窗口功能。一旦订购了将它们放入CTE中的方式,您就可以使新列使用LAG函数,该函数复制上一行的数据“直到看到新产品”。这也假设您有一个像ProductNo这样的PrimaryKey可以将两者结合起来。希望对您有所帮助。