我想了解如何为下面示例表中的最后一列Total_Concat_Quantity
编写以下SUM计算。
请注意,我的数据集包含数千种重复的Concat
组合。我不打算从数据集中删除重复项。我不是在寻找包含硬编码信息的解决方案 - 例如(SUM(CASE WHEN [Concat] = '201201A' THEN..
,因为Concat
**TABLE 1** :- Year, Month, YYYYMM, Product, Concat, Quantity, Total_Concat_Quantity
2012 / / JAN / / 201201 / / A / / 201201A / / 11 / / 48
2012 / / JAN / / 201201 / / A / / 201201A / / 37 / / 48
2013 / / JAN / / 201301 / / B / / 201301B / / 19 / / 30
2013 / / JAN / / 201301 / / B / / 201201B / / 11 / / 30
2012 / / FEB/ / 201202 / / C / / 201202C / / 17 / / 17
2012 / / NOV/ / 201211 / / C / / 201211C / / 41 / / 54
2013 / / JAN / / 201301 / / A / / 201301A / / 53 / / 53
2013 / / FEB/ / 201302 / / B / / 201302B / / 47 / / 47
2012 / / NOV/ / 201211 / / C / / 201211C / / 13 / / 54
2013 / / FEB / / 201302 / / A / / 201302A / / 23 / / 23
答案 0 :(得分:2)
大多数SQL版本都支持窗口/分析函数。这是sytnax:
select t.*, sum(quantity) over (partition by product) as TotalConcatQuantity
from table t;
也可以将此表示为带连接的聚合,但窗口函数更容易键入,更清晰,并且可能更好地执行。
答案 1 :(得分:0)
戈登已经提到过加入的替代方案。如果分析函数不可用,它也可以表示为相关子查询。
select *
, ( select sum(T2.quantity) as Total_Concat_Quantity
from T as T2
where T2.concat = T.concat )
from T
使用显式连接的问题是T中的行将乘以具有相同concat值的相应行数。因此,您必须进行分组和聚合(最小或最大)以获得具有原始值的单行。