Самостоятельная регистрация без двойного учета продаж - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь создать запрос на рыночную корзину. Table_data извлекает все транзакции для всех товаров, совместно использующих корзину с Host_Category (категория 123 в данном случае); но текущий SQL, который я использую, дублирует продажи прикрепленных товаров, так как я делаю полное соединение таблицы с самим собой, и иногда в одной транзакции содержится более 1 предмета категории хостов (как показано в примере ниже):

Picture of example table and output

Как мне изменить мой запрос для получения желаемого результата?

Мой запрос ниже:

SELECT Host_Category,Attached_Item
       ,Count(DISTINCT Trx_NBR || Location_NBR || Trx_Date) AS Shared_Trx_Count
       ,Sum(Host_Sales) AS Host_Sales
       ,Sum(Attached_Sales) AS Attached_Sales
FROM (SELECT a.Trx_NBR, a.Trx_Date, a.Location_NBR
             ,CASE WHEN a.Category IN (123) THEN '123' END AS Host_Category
             ,a.sales AS Host_Sales
             ,b.Item AS Attached_Item, b.sales AS Attached_Sales
      FROM table_data a FULL JOIN table_data b
      ON a.Trx_NBR = b.Trx_NBR AND a.Location_NBR = b.Location_NBR AND a.Trx_Date = b.Trx_Date
      WHERE a.Category IN (123) ) AS c GROUP BY 1,2

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Объедините перед объединением, чтобы получить уникальные данные. Это может быть то, что вы хотите:

SELECT Host_Category,Attached_Item
       -- do you still need COUNT(DISTINCT)? Or is COUNT(*) ok?
       ,Count(DISTINCT Trx_NBR || Location_NBR || Trx_Date) AS Shared_Trx_Count
       ,Sum(Host_Sales) as Host_Sales
       ,Sum(Attached_Sales) AS Attached_Sales
FROM
 (
   SELECT a.*
         ,b.Item AS Attached_Item
         ,b.sales AS Attached_Sales
   FROM
    (
      SELECT a.Trx_NBR, a.Trx_Date, a.Location_NBR
          ,CASE WHEN a.Category IN (123) THEN '123' END AS Host_Category
          ,Sum(a.sales) AS Host_Sales
      FROM table_data AS a
      WHERE a.Category IN (123)
      GROUP BY 1,2,3,4
    ) AS a
   -- your previous Full Join was a Left Join anyway due to the WHERE-condition
   LEFT JOIN table_data b
   ON a.Trx_NBR = b.Trx_NBR 
   AND a.Location_NBR = b.Location_NBR
   AND a.Trx_Date = b.Trx_Date
 ) AS c 
GROUP BY 1,2
0 голосов
/ 26 февраля 2020

Вы можете просто использовать мин / макс или другую функцию агрегирования вместо суммы, и это может помочь:

SELECT Host_Category,Attached_Item
       ,Count(DISTINCT Trx_NBR || Location_NBR || Trx_Date) AS Shared_Trx_Count
       ,Sum(Host_Sales) AS Host_Sales
       ,min(Attached_Sales) AS Attached_Sales
FROM (SELECT a.Trx_NBR, a.Trx_Date, a.Location_NBR
             ,CASE WHEN a.Category IN (123) THEN '123' END AS Host_Category
             ,a.sales AS Host_Sales
             ,b.Item AS Attached_Item, b.sales AS Attached_Sales
      FROM table_data a FULL JOIN table_data b
      ON a.Trx_NBR = b.Trx_NBR AND a.Location_NBR = b.Location_NBR AND a.Trx_Date = b.Trx_Date
      WHERE a.Category IN (123) ) AS c GROUP BY 1,2
...