teradata 中的多行由 group by 产生的情况

问题描述 投票:0回答:1

我正在尝试将一堆行的列进行连接,但在添加列的值之前需要验证一些条件,所以基本上可以说我有一个包含 userId、discountCode 和 flag 的表(0,1,2)

userId  discountCode    FLAG 
abo1    remise 1        1
abo1    Remise 2        2
abo1    remise 100%     0
abo1    remise 16%      0
abo2    remise 1        0
abo2    Remise 2        0
abo2    remise 100%     0
abo2    remise 16%      0

我需要的是,对于每个用户,我必须将折扣代码连接在一列中,但在以下情况下: 如果该用户的所有标志均为 0,我们将采用所有折扣代码 如果存在 0 和其他值的混合,我们不会添加标志为 0 的折扣代码 如果所有折扣代码都是<> 0,我们将它们全部添加。 所以之前的数据结果应该是:

userId  discountCode
abo1    remise 1 | Remise 2
abo2    remise 1 | Remise 2 |  remise 100% | remise 16%


 TRIM(
    TRAILING ',' FROM (
      XMLAGG(TRIM(COALESCE(discountCode , -1) || '') ) (VARCHAR(1000)) 
    )

我使用此函数将折扣代码分组在一列中,但我不知道如何检查标志的条件

group-by concatenation aggregate teradata
1个回答
0
投票

我们可以使用

SUM()
窗口函数来计算每个用户的总数。然后,我们通过应用条件
WHERE FLAG <> 0 OR SM = 0
:

排除标志为 0 并且总数大于 0 的行
SELECT userId, TRIM(
                 TRAILING ',' FROM (
                   XMLAGG(TRIM(COALESCE(discountCode , -1) || '') ) (VARCHAR(1000)) 
               ) AS discounts
FROM (
  SELECT userId, 
         discountCode, 
         FLAG, 
         SUM(FLAG) OVER (PARTITION BY userId ) AS SM
  FROM mytable
) as s
WHERE FLAG <> 0 OR SM = 0
GROUP BY userId;

sql server 上的演示

© www.soinside.com 2019 - 2024. All rights reserved.