如何根据另一列类型不同地求和同一列

时间:2019-09-10 01:00:05

标签: tsql dynamic alteryx

我有一个要在Alteryx中创建的SQL查询。该查询通过一个发票表并根据与之关联的位置汇总不同的费用。因此,每个位置的每一列可以具有不同的类型。下面是一个示例:

Location    FreightCharge   InvoiceCharge
A           FRT             IVC
B           FRT, CHG        IVC, DTL

当我只需要担心一个位置时,使用带有case语句的查询就可以了。现在我可能有数百名。我创建了一个位置表,其中包含类型(上面的表)。但是我不相信这是正确的方法。

最终,我要么想要一个可以从头开始执行此操作的SQL语句(alteryx),要么(更可能是)一个我可以用来遍历链接到引用表并自动对这些数据进行计数的工作流。

有什么想法吗?

但是,如果我可以在每个位置运行此命令并将其附加到发票表,那就太好了。

我尝试创建参考表并将其加入我的主要发票查询中,但是我无法通过正确的数据对其进行过滤。我已经考虑过创建一个遍历每条记录的Alteryx或SSIS包,但是我不需要一次遍历一条记录。一次仅一个位置。

这将进入位置A的此类表中

    Select Location, InvoiceNumber, Case WHEN InvoiceType IN('FRT') THEN InvoiceAmount Else 0 End as FreightCharge  --**I want this to be dynamic depending on location, Case WHEN InvoiceType IN('IVC','DTL') then InvoiceAmount Else 0 End as InvoiceCharge --**I want this to be dynamic depending on location From Invoicing Where InvoiceDate = Today

我想要一张发票表,其中所有位置及其总和值(根据参考表应如何求和)全部集中在一张表中。

1 个答案:

答案 0 :(得分:0)

假设您将查询表组织为:

Location GroupLabel  InvoiceType
A        Freight     FRT
A        Invoice     IVC
B        Freight     FRT
B        Freight     CHG
B        Invoice     IVC
B        Invoice     DTL

听起来您的数据就像...

Location  InvoiceNumber  InvoiceAmount  InvoiceType
A         1              1.00           FRT
A         1              2.00           IVC
A         2              3.00           FRT
A         2              4.00           IVC
B         3              5.00           FRT
B         3              6.00           IVC
B         4              7.00           CHG
B         4              8.00           DTL

然后,我认为以下内容将为您提供帮助...

Select
    i.Location
  , i.InvoiceNumber
  , l.GroupLabel
  , Sum(i.Amount)
From
    Invoicing i
    Inner Join LookupTable l
       on l.Location = i.Location
      and l.InvoiceType = i.InvoiceType
Group By
    i.Location
  , i.InvoiceNumber
  , l.GroupLabel

在Alteryx中,在进行按所示的三个字段分组并汇总InvoiceAmount的汇总之前,对Location和InvoiceType进行联接应该非常简单。