我是编写查询和SQL语言的新手。
我在弄清楚如何编写查询以找出AdventureWorks数据库中的哪个客户在花钱方面最为一致时遇到了问题。
一致意味着什么?就像每年订单的客户一样,即使他/她可能不会在订单上花太多钱?关于如何开始编写此查询的任何输入都将非常有用。
这些是我正在考虑解决问题的表格中的一些字段。
SalesOrderID,OrderDate,CustomerID,SalesPersonID,TotalDue
答案 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]我使用的是公用表表达式,这里有详细记录:
我注意到的一个问题是使用AVG()函数生成的函数内部的平均值返回一个舍入数字。我试图使用CAST()函数将其转换为小数,但它需要更多的工作。 CAST是一个可用于将列转换为不同数据类型的函数。如果你能得到小数,它将允许更精确的排名。
这是一个粗略的草案,说明如何通过T-SQL来解决确定客户支出一致性的问题,探索不同的SQL结构。这是一个有趣的问题,我想看到其他评论。我认为看一下花钱也会更有利。