Sql 交叉销售矩阵-雪花

Sql 交叉销售矩阵-雪花,sql,matrix,pivot,snowflake-cloud-data-platform,Sql,Matrix,Pivot,Snowflake Cloud Data Platform,我试图建立一个交叉销售矩阵,其结构如下所示,其中X是与其他产品在一篮子中的频率百分比: 之后我需要在excel或其他工具中透视这些数据,因此我假设Snowflake中的查询需要输出准备透视的表格数据集,我正在努力处理它的逻辑 这就是我到目前为止所做的: SELECT FCT.TRANSACTION_ID, PRD.PRODUCT_TYPE, COUNT(DISTINCT FCT.PRODUCT_ID), COUNT(DISTINCT FCT1.PRODUCT_ID) FROM

我试图建立一个交叉销售矩阵,其结构如下所示,其中X是与其他产品在一篮子中的频率百分比:

之后我需要在excel或其他工具中透视这些数据,因此我假设Snowflake中的查询需要输出准备透视的表格数据集,我正在努力处理它的逻辑

这就是我到目前为止所做的:

SELECT FCT.TRANSACTION_ID,
   PRD.PRODUCT_TYPE,
   COUNT(DISTINCT FCT.PRODUCT_ID),
   COUNT(DISTINCT FCT1.PRODUCT_ID)
FROM TRANSACTION_ORDERS FCT
     INNER JOIN DIM_PRODUCT PRD ON FCT.PRODUCT_ID = PRD.PRODUCT_ID
     LEFT JOIN FACT_TRANSACTION_ORDERS FCT1 ON FCT.TRANSACTION_ID = FCT1.TRANSACTION_ID
                                            AND FCT.PRODUCT_ID != FCT1.PRODUCT_ID
GROUP BY FCT.TRANSACTION_ID, FCT.PRODUCT_ID, FCT1.PRODUCT_ID
连接是否正确?或者我应该做交叉连接?另外,如何捕获同一篮子中两种产品的百分比频率

非常感谢

编辑:我试图捕捉不同产品类型出现在同一篮子中的频率

两个方向上的组合值相同。ProductType1与列ProductType2的交点与列ProductType1行ProductType2的值相同


在篮子交叉分析中,它们应该有所不同。每个方向都不一样。换句话说,具有ProductType1的篮子可能具有ProductType2 X%的时间,但是具有ProductType2的篮子应该具有具有Y%的时间的ProductType1。

您想要自联接。我希望产品的顺序是一样的,但你们似乎在使用相同的交易。在任何情况下,这都是查询的结构:

WITH TP AS (
      SELECT T.*, P.PRODUCT_TYPE
      FROM TRANSACTION_ORDERS T JOIN
            DIM_PRODUCT P
            ON T.PRODUCT_ID = P.PRODUCT_ID
     )
SELECT TP.PRODUCT_TYPE, TP2.PRODUCT_TYPE,
       COUNT(DISTINCT TP.TRANSACTION_ID) as NUM_ORDERS
FROM TP JOIN
     TP TP2
     ON TP2.TRANSACTION_ID = TP.TRANSACTION_ID
GROUP BY TP.PRODUCT_TYPE, TP2.PRODUCT_TYPE;
如果这是每个订单,您只需更改外部查询中的
ON
子句以使用订单id

请注意,这使用了
COUNT(DISTINCT)
而不是
COUNT(*)
,因为一个交易/订单可能有多个相同类型的产品。想必,你希望只计算一次

编辑:

如果您想除以任何一种产品类型的交易数量(这对我来说都是有意义的),那么我的方法是:

WITH TP AS (
      SELECT DISTINCT T.TRANSACTION_ID, P.PRODUCT_TYPE
      FROM TRANSACTION_ORDERS T JOIN
            DIM_PRODUCT P
            ON T.PRODUCT_ID = P.PRODUCT_ID
     )
SELECT TP.PRODUCT_TYPE, TP2.PRODUCT_TYPE,
       COUNT(*) as NUM_ORDERS,
       ( MAX(CASE WHEN TP.PRODUCT_TYPE = TP2.PRODUCT_TYPE THEN COUNT(*) END) OVER (PARTITION BY TP.PRODUCT_TYPE) +
         MAX(CASE WHEN TP.PRODUCT_TYPE = TP2.PRODUCT_TYPE THEN COUNT(*) END) OVER (PARTITION BY TP2.PRODUCT_TYPE) -
         COUNT(*)
       ) as Num_Orders_Either,
       ( COUNT(*) * 1.0 /
         ( MAX(CASE WHEN TP.PRODUCT_TYPE = TP2.PRODUCT_TYPE THEN COUNT(*) END) OVER (PARTITION BY TP.PRODUCT_TYPE) +
           MAX(CASE WHEN TP.PRODUCT_TYPE = TP2.PRODUCT_TYPE THEN COUNT(*) END) OVER (PARTITION BY TP2.PRODUCT_TYPE) -
           COUNT(*)
       ) as ratio
FROM TP JOIN
     TP TP2
     ON TP2.TRANSACTION_ID = TP.TRANSACTION_ID
GROUP BY TP.PRODUCT_TYPE, TP2.PRODUCT_TYPE;

这将使用两种产品的订单之和减去两种产品的数量来计算包含这两种产品的订单总数。

示例数据——或者至少是表格布局——会有所帮助。@GordonLinoff——与此问题相关的唯一列应该是交易ID、产品ID、产品类型。谢谢您的回答。这个答案产生了大量的订单,这很好,但我如何才能产生这一事件的%呢?@choloboy。你会被一些东西分开。不清楚是什么,因为你的问题没有具体说明逻辑,也不明显。有一件事我不清楚。两个方向上的组合值相同。ProductType1与列ProductType2的交点与列ProductType1行ProductType2的值相同。在篮子交叉分析中,它们应该有所不同。每个方向都不一样。在其他情况下,ProductType1的篮子可能有ProductType2 X%的时间,但ProductType2的篮子应该有ProductType1 Y%的时间。在所有情况下,情况都不应该相同。我如何修改你的第二个查询来解释这个问题?@choloboy。你的问题没有说明计算是什么。我只是加了一个合理的猜测。你的猜测很合理,谢谢。计算是完美的。我只是想知道矩阵和calc的双向性。更新了问题。我只是想知道如何更新您的合理猜测,以解释篮子中产品频率的双向性。