查询大多数“常规”消费客户的方法(AdventureWorks)

时间:2017-01-19 19:06:32

标签: mysql sql database

我是编写查询和SQL语言的新手。

我在弄清楚如何编写查询以找出AdventureWorks数据库中的哪个客户在花钱方面最为一致时遇到了问题。

一致意味着什么?就像每年订单的客户一样,即使他/她可能不会在订单上花太多钱?关于如何开始编写此查询的任何输入都将非常有用。

这些是我正在考虑解决问题的表格中的一些字段。

SalesOrderID,OrderDate,CustomerID,SalesPersonID,TotalDue

2 个答案:

答案 0 :(得分:0)

请对Aggregate函数进行研究并尝试将它们应用到您的表中。我想其中一个功能可以帮助你解决问题

答案 1 :(得分:0)

一致性的定义:随着时间的推移,性质,标准或效果不变

如果我们谈论的是客户花钱,我认为一致性会衡量订单数量与时间的关系......你可以创建一个临时表来存储汇总数据......就像这样:

CREATE FUNCTION udf_customerAverageDayBetweenSale
(   
     @CustomerID INT
)
RETURNS TABLE 
AS
RETURN 
(

WITH RowOrderedOrderDatesCTE AS (
    SELECT ROW_NUMBER() OVER (order by OrderDate) as row, OrderDate
    FROM [AdventureWorks2014].[Sales].[SalesOrderHeader] WHERE CustomerID = @CustomerID
), DateChangesCTE as (
    SELECT DATEDIFF(dd, o2.OrderDate, o1.OrderDate) as DifferentBetweenDates
    FROM RowOrderedOrderDatesCTE o1 left outer join
        RowOrderedOrderDatesCTE o2 on o1.row = o2.row + 1
)
SELECT AVG(cast(DifferentBetweenDates as decimal)) As AverageDaysBetweenSales
FROM DateChangesCTE
WHERE DifferentBetweenDates is NOT NULL 

)

CREATE TABLE #CustomerConsistency (

 CustomerID INT
,AverageDayBetweenOrder Decimal
,NumberOfOrders INT

)  

INSERT INTO #CustomerConsistency

SELECT  

SOH.[CustomerID] 
,(SELECT CAST(AverageDaysBetweenSales As Decimal) FROM dbo.udf_customerAverageDayBetweenSale(SOH.CustomerID))
,Count(*) 

FROM [AdventureWorks2014].[Sales].[SalesOrderHeader] As SOH
GROUP BY CustomerID 


SELECT * FROM #CustomerConsistency
WHERE AverageDayBetweenOrder IS NOT Null
ORDER BY NumberOfOrders, AverageDayBetweenOrder; 

DROP TABLE #CustomerConsistency

修改

参考要求解释:

上面的CREATE FUNCTION使用了一个内联表值函数,这里有详细记载:

Using Inline-Table Valued Functions

在函数内部[udf_customerAverageDayBetweenSale]我使用的是公用表表达式,这里有详细记录:

Using CTEs

我注意到的一个问题是使用AVG()函数生成的函数内部的平均值返回一个舍入数字。我试图使用CAST()函数将其转换为小数,但它需要更多的工作。 CAST是一个可用于将列转换为不同数据类型的函数。如果你能得到小数,它将允许更精确的排名。

这是一个粗略的草案,说明如何通过T-SQL来解决确定客户支出一致性的问题,探索不同的SQL结构。这是一个有趣的问题,我想看到其他评论。我认为看一下花钱也会更有利。