Получите продажи AVG на основе количества уникальных идентификаторов транзакций (SNOWFLAKE). - PullRequest
1 голос
/ 30 января 2020

У меня есть розничная база данных, в которую я хочу вывести свою Transaction Sale AMT вместе с подробностями уровня продукта.

К сожалению, я понял, что мой столбец SALE_AMT - это общая сумма продаж по сделке, а не продажа по товарам. Из-за этого мой SALE_AMT дублируется числом раз, когда появляется уникальный идентификатор транзакции (в зависимости от того, сколько продуктов было куплено в этой одной транзакции).

Я думаю, что лучший способ бороться с этим и получить точную транзакцию Sale_AMT - это выполнить AVG для SALE_AMT / Количество раз, которое указывает c идентификатор транзакции. Тем не менее, мне трудно понять, как это сделать. Мой 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

Пример дублирования продажи транзакции по продукту:
Example of Transaction Sale Duplication by Product

1 Ответ

0 голосов
/ 31 января 2020

Таким образом, вы получаете приблизительную / среднюю / поддельную цену за единицу, взяв среднее

WITH data_table AS (
    SELECT * FROM VALUES
        (1,'2020-01-27',517.66,'Rocking Chair'),
        (1,'2020-01-27',517.66,'Plush Animal'),
        (1,'2020-01-27',517.66,'Rug'),
        (1,'2020-01-27',517.66,'Couch'),
        (1,'2020-01-27',517.66,'Bar Stool'),
        (2,'2020-01-28',59.09,'Painting'),
        (2,'2020-01-28',59.09,'Rug')
        v(trans_unique_key, fiscal_dt, sale_amt, prdct_desc)
)
SELECT a.*
    ,sum(fake_item_cost_2dp)over(partition by trans_unique_key) AS sum_of_parts_not_eqaul_the_whole
FROM (
    SELECT *
        ,SALE_AMT/count(*)over(partition by trans_unique_key) as FAKE_ITEM_COST
        ,round(FAKE_ITEM_COST,2) AS fake_item_cost_2dp
    FROM data_table
) AS a
ORDER BY 2,1;

, что дает:

TRANS_UNIQUE_KEY    FISCAL_DT   SALE_AMT    PRDCT_DESC  FAKE_ITEM_COST  FAKE_ITEM_COST_2DP  SUM_OF_PARTS_NOT_EQAUL_THE_WHOLE
1   2020-01-27  517.66  Rocking Chair   103.53200000    103.53  517.65
1   2020-01-27  517.66  Plush Animal    103.53200000    103.53  517.65
1   2020-01-27  517.66  Rug 103.53200000    103.53  517.65
1   2020-01-27  517.66  Couch   103.53200000    103.53  517.65
1   2020-01-27  517.66  Bar Stool   103.53200000    103.53  517.65
2   2020-01-28  59.09   Painting    29.54500000 29.55   59.10
2   2020-01-28  59.09   Rug 29.54500000 29.55   59.10

, что обычно считается плохим для округления и сумма, или среднее значение, и снова сумма, и / или числа с плавающей запятой не являются стабильными.

Но один из моих главных моментов в том, что fake_per_item_price не имеет особого смысла, если только вы не собираетесь агрегировать обратно до снова на уровне транзакции, и в этот момент будет просто иметь смысл ANY_VALUE.

WITH data_table AS (
    SELECT * FROM VALUES
        (1,'2020-01-27',517.66,'Rocking Chair'),
        (1,'2020-01-27',517.66,'Plush Animal'),
        (1,'2020-01-27',517.66,'Rug'),
        (1,'2020-01-27',517.66,'Couch'),
        (1,'2020-01-27',517.66,'Bar Stool'),
        (2,'2020-01-28',59.09,'Painting'),
        (2,'2020-01-28',59.09,'Rug')
        v(trans_unique_key, fiscal_dt, sale_amt, prdct_desc)
)
SELECT trans_unique_key, fiscal_dt, ANY_VALUE(sale_amt) as sale_amt, count(*) as total_items_count, count(distinct prdct_desc) as distinct_items_count 
FROM data_table
GROUP BY 1,2
ORDER BY 2,1;

, дающий:

TRANS_UNIQUE_KEY    FISCAL_DT   SALE_AMT    TOTAL_ITEMS_COUNT   DISTINCT_ITEMS_COUNT
1   2020-01-27  517.66  5   5
2   2020-01-28  59.09   2   2
...