如何计算客户支出变化百分比?

时间:2019-08-21 09:22:47

标签: sql sql-server

以下数据是移动销售商店的数据。查找每年的前5名客户及其平均支出和平均数量。还可以找到支出百分比的变化。

在此问题中,我想问一下如何计算支出变化百分比。

IDMODEL| CUSTID |  DATE      | price   |QTY
-------------------------------------------
114    | 10015  |2005-02-15  | 52.00   | 1
110    | 10027  |2005-10-23  | 84.00   | 1
110    | 10038  |2003-02-26  | 170.00  | 2
130    | 10044  |2009-05-25  | 500.00  | 1
107    | 10043  |2003-04-16  | 126.00  | 1
126    | 10022  |2003-11-03  | 169.00  | 1
111    | 10045  |2010-01-01  | 286.00  | 1
118    | 10012  |2007-04-21  | 149.00  | 1
128    | 10044  |2010-10-19  | 318.00  | 1
124    | 10003  |2010-10-03  | 435.00  | 1
117    | 10002  |2010-10-13  | 54.00   | 1
112    | 10049  |2003-05-20  | 18.00   | 1
129    | 10041  |2004-02-04  | 409.00  | 1
126    | 10048  |2010-10-22  | 173.00  | 1
112    | 10024  |2005-03-23  | 17.00   | 1
     select top 5 [CUSTID] as CUST,
     avg([Price]) as AVG_SPEND,
     avg([Qty]) as AVG_QTY ,
     year(date) as year 
     from [dbo].[FACT_TRANSACTIONS]
     group by [CUSTID],year(date)
     order by AVG_SPEND desc

1 个答案:

答案 0 :(得分:0)

以下查询可能会帮助您进行百分比计算:

update

结果如下,

CREATE TABLE #temp (IDMODEL INT,CUSTID INT,[DATE] DATE,price NUMERIC(20,2), QTY INT)
INSERT INTO #temp VALUES
(114,100,'2005-02-15',52.00,1),
(115,100,'2005-10-23',100.00,2),
(116,100,'2006-10-23',120.00,1),
(117,100,'2007-10-23',90.00,3),
(118,100,'2007-10-23',84.00,1),
(114,100,'2008-10-23',52.00,1),
(110,200,'2005-10-23',80.00,1),
(116,200,'2006-10-23',120.00,2),
(115,200,'2006-10-23',100.00,1)

SELECT CUSTID
    ,dt_Year AS [Year]
    ,avg_Price AS [Average Price]
    ,avg_Qty AS [Average Quantity]
    ,total_Spend AS [Total Spend]
    ,CASE WHEN Prev_Spend = 0 THEN NULL ELSE CONVERT(NUMERIC(25,0),((total_Spend-Prev_Spend)/Prev_Spend) * 100) END AS [% Change]

FROM (
    SELECT CUSTID,YEAR([DATE]) AS dt_Year,AVG(Price) AS avg_Price,AVG(QTY) AS avg_Qty,SUM([Spend]) AS [total_Spend]
        ,LAG(SUM(T.[Spend]),1,0) OVER(PARTITION BY CUSTID ORDER BY (YEAR([DATE]))) [Prev_Spend]
        ,ROW_NUMBER() OVER (PARTITION BY CUSTID ORDER BY SUM([Spend]) DESC) RNO
    FROM #temp
    CROSS APPLY (VALUES(Price*Qty)) AS T([Spend])
    GROUP BY CUSTID,YEAR([DATE]) ) A
WHERE RNO <= 5
ORDER BY CUSTID,[Year]