【发布时间】:2020-05-16 10:32:48
【问题描述】:
我有一个零售数据库,我想提取我的交易销售 AMT 以及产品级别的详细信息。
不幸的是,我意识到我的 SALE_AMT 列是我的总交易销售额,而不是按产品分类的销售额。因此,我的 SALE_AMT 与唯一交易 ID 出现的次数重复(基于该交易中购买了多少产品)。
我认为解决此问题并获得准确交易 Sale_AMT 的最佳方法是对 SALE_AMT / 特定交易 ID 发生的次数执行 AVG。但是,我很难弄清楚如何做到这一点。我的 SQL 如下:
WITH PRODUCT_CTE AS (
...
)
SELECT
A.TRANS_UNIQUE_KEY, //Unique Transaction Identifier//
...
A.SALE_AMT, // This is the field for SALE_AMT showing the entire transaction SALE AMT and duplicated for each product
...
D.PRDCT_DESC,
...
FROM "tablename"A
LEFT OUTER JOIN "tablename"G
ON A.DT_SKEY = G.DT_SKEY
LEFT OUTER JOIN "tablename"H
ON A.TM_SKEY = H.TM_SKEY
LEFT OUTER JOIN "tablename"C
ON A.STORE_KEY = C.STORE_KEY
INNER JOIN "tablename"E
ON A.TRANS_TYP_KEY = E.TRANS_TYP_KEY
LEFT OUTER JOIN "tablename"F
ON A.CUST_KEY = F.CUST_KEY
LEFT OUTER JOIN PRODUCT_CTE D
ON A.TRANS_UNIQUE_KEY=D.TRANS_UNIQUE_KEY
WHERE YEAR(G.FISCAL_DT)>= YEAR(CURRENT_DATE())-1
ORDER BY G.FISCAL_DT DESC
【问题讨论】:
-
样本数据、所需结果和简化查询都会使您的问题更有可能得到回答。
-
也许你想要一个窗口聚合:
A.SALE_AMT / count(*) over (partition by A.TRANS_UNIQUE_KEY) -
@dnoeth - 这正是我所需要的!非常感谢!
-
@GordonLinoff - 感谢您的提示 =)。做出了这些更改,并将牢记在未来!
-
sale_amt/count(*) over (partition by..)会给出每件商品的虚假价格,但为每件商品设置虚假价格是没有意义的。如果您要进行交易,您不想要假的AVG部分的SUM,而是更多类似ANY_VALUE
标签: sql average snowflake-cloud-data-platform snowflake-schema