объединение транзакций с сохранением всех демографических столбцов - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть несколько транзакций для одних и тех же людей, и я хочу объединить их все и получить общую сумму расходов для каждой, но я хочу сохранить все их демографические переменные в одной таблице, когда я попробовал некоторые коды, такие как SELECT DISTINCT Я просто удалю несколько дубликатов вместо слияния, моя цель - распределить клиентов по двум группам: Низкое и Высокое. Либо тот, кто купил 1 предмет за 950 долларов, либо купил несколько предметов и потратил более 2500 долларов. (каждая транзакция - это просто один элемент, ни одна из транзакций не содержит более 1 элемента.

Вот мой код. (я готовлю его к SAS)

Select        
CUS.FirstName        
,CUS.LastName        
,CUS.NumberChildrenAtHome        
,CUS.CommuteDistance        
,CUS.CustomerKey        
,FIS.SalesAmount        
,CUS.Gender        
,CUS.MaritalStatus        
,CUS.HouseOwnerFlag        
,CUS.NumberCarsOwned        
,CUS.YearlyIncome        
,CUS.TotalChildren        
,CUS.EnglishEducation AS Education        
,floor(DATEDIFF(DAY,BirthDate,getdate()))/365.25 AS AGE
,CASE        
WHEN FIS.UnitPrice >=950 OR FIS.SalesAmount >=2500 THEN 'High Value'        
ELSE 'Low Value'        
END AS 'Customer Value'        
From dbo.FactInternetSales AS FIS        
LEFT JOIN DBO.DimCustomer AS CUS        
ON FIS.CustomerKey = CUS.CustomerKey        
LEFT JOIN dbo.DimSalesTerritory AS DST        
ON FIS.SalesTerritoryKey = DST.SalesTerritoryKey

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

Спасибо

1 Ответ

0 голосов
/ 26 апреля 2019

Сначала вы должны SUM BY суммы, а затем вы можете классифицировать на основе итогов. Внутренний запрос даст вам сумму для каждого человека. Внешний запрос установит категорию в зависимости от вашего состояния.

- отредактировано -

SELECT
    innerQuery.*,
    CASE WHEN Total_Unit_Price >= 950
    OR Total_Sales_Amount >= 2500 THEN 'High Value' ELSE 'Low Value' END AS 'Customer Value'
FROM
    (
        Select
            CUS.FirstName,
            CUS.LastName,
            CUS.NumberChildrenAtHome,
            CUS.CommuteDistance,
            CUS.CustomerKey,
            FIS.SalesAmount,
            CUS.Gender,
            CUS.MaritalStatus,
            CUS.HouseOwnerFlag,
            CUS.NumberCarsOwned,
            CUS.YearlyIncome,
            CUS.TotalChildren,
            CUS.EnglishEducation AS Education,
            floor(DATEDIFF(DAY, BirthDate, getdate())) / 365.25 AS AGE,
            SUM(FIS.UnitPrice) AS Total_Unit_Price,
            SUM(FIS.SalesAmount) AS Total_Sales_Amount
        From
            dbo.FactInternetSales AS FIS
            LEFT JOIN DBO.DimCustomer AS CUS ON FIS.CustomerKey = CUS.CustomerKey
            LEFT JOIN dbo.DimSalesTerritory AS DST ON FIS.SalesTerritoryKey = DST.SalesTerritoryKey
        GROUP BY
            CUS.FirstName,
            CUS.LastName,
            CUS.NumberChildrenAtHome,
            CUS.CommuteDistance,
            CUS.CustomerKey,
            FIS.SalesAmount,
            CUS.Gender,
            CUS.MaritalStatus,
            CUS.HouseOwnerFlag,
            CUS.NumberCarsOwned,
            CUS.YearlyIncome,
            CUS.TotalChildren,
            CUS.EnglishEducation,
            floor(DATEDIFF(DAY, BirthDate, getdate())) / 365.25
    ) innerQuery
...