如何在 Snowflake 中使用展平逻辑

How do I use flatten logic in Snowflake

select * from
(SELECT ID,purchase_list,
      CASE WHEN purchase_list LIKE '12432%'  THEN replace(purchase_list,12432,'Amt_Saved: Mastercard(12432)')
     END AS purchase_amt    
  FROM (
        SELECT ID,index,d.value::string AS purchase_list 
 FROM (
       SELECT  ID,c.value::string AS purchase_list
      FROM table_1,LATERAL flatten(INPUT=>split(purchase_order_list, '|')) c                
     ), LATERAL flatten(INPUT=>split(purchase_list, ';')) d
       ) 
 )WHERE purchase_amt is not null

当我运行上述查询时,我得到如下所述的结果:

ID         PURCHASE_LIST         PURCHASE_AMT
12810789    12432=3.00           Savings1: Mastercard(12432)=3.00
12810789    12432=0.99           Savings1: Mastercard(12432)=0.99
12810789    12432=0.49           Savings1: Mastercard(12432)=0.49

我想将这些金额相加 (3.00 + 0.99 + 0.49)=4.48 并将此结果显示在同一列或另一列中

结果应如下所示:

ID         PURCHASE_LIST         PURCHASE_AMT
12810789    12432=4.48            4.48

如何通过使用任何其他逻辑来使用 SUM 函数来实现这个?

敬请指导。提前致谢:)

首先,您现有的 SQL 可以重写为:

SELECT 
    a.id,
    d.value::string AS purchase_list,
    IFF( purchase_list LIKE '12432%', REPLACE(purchase_list, 12432, 'Amt_Saved: Mastercard(12432)'), null) purchase_amt    
FROM table_1 AS a 
    ,LATERAL flatten(INPUT=>split(a.purchase_order_list, '|')) c                
    ,LATERAL flatten(INPUT=>split(c.value::string, ';')) d
WHERE purchase_amt IS NOT NULL;

因此我们可以添加一个 SUM() OVER() 子句来获取每行的总计,如果您需要部分和总计:

SELECT 
    a.id,
    d.value::string AS purchase_list,
    IFF( purchase_list LIKE '12432%', REPLACE(purchase_list, 12432, 'Amt_Saved: Mastercard(12432)'), null) purchase_amt,
    SUM(REGEXP_REPLACE(purchase_list, '12432=([0-9.]+)', '\1', 1,1,'e')::number(9,3)) over (partition by id) as sum_total
FROM table_1 AS a 
    ,LATERAL flatten(INPUT=>split(a.purchase_order_list, '|')) c                
    ,LATERAL flatten(INPUT=>split(c.value::string, ';')) d
WHERE purchase_amt IS NOT NULL;
ID PURCHASE_LIST PURCHASE_AMT SUM_TOTAL
12810789 12432=3.00 Amt_Saved: Mastercard(12432)=3.00 4.48
12810789 12432=0.99 Amt_Saved: Mastercard(12432)=0.99 4.48
12810789 12432=0.49 Amt_Saved: Mastercard(12432)=0.49 4.48

或者您可以分组而不关心所有子值:

SELECT 
    a.id,
    SUM(REGEXP_REPLACE(d.value::string, '12432=([0-9.]+)', '\1', 1,1,'e')::number(9,3)) AS sum_total
FROM table_1 AS a 
    ,LATERAL flatten(INPUT=>split(a.purchase_order_list, '|')) c                
    ,LATERAL flatten(INPUT=>split(c.value::string, ';')) d
GROUP BY 1;

给出:

ID SUM_TOTAL
12810789 4.48