2016-07-22 30 views
0

我有如下表:獲取一個月的使用量月增幅爲每個客戶

DECLARE @MyTable TABLE (
    CustomerName nvarchar(max), 
    [Date] date, 
    [Service] nvarchar(max), 
    UniqueUsersForService int 
) 

INSERT INTO @MyTable VALUES 
('CompanyA', '2016-07-14', 'Service1', 100), 
('CompanyA', '2016-07-15', 'Service1', 110), 
('CompanyA', '2016-07-16', 'Service1', 120), 
('CompanyA', '2016-07-14', 'Service2', 200), 
('CompanyA', '2016-07-15', 'Service2', 220), 
('CompanyA', '2016-07-16', 'Service2', 500), 
('CompanyB', '2016-07-14', 'Service1', 10000), 
('CompanyB', '2016-07-15', 'Service1', 10500), 
('CompanyB', '2016-07-16', 'Service1', 11000), 
('CompanyB', '2016-07-14', 'Service2', 200), 
('CompanyB', '2016-07-15', 'Service2', 300), 
('CompanyB', '2016-07-16', 'Service2', 300) 

基本上它是顯示有多少人使用的每個服務的每家公司名單。例如,在CopmanyA,14th of July中,使用了100個唯一用戶Service1。實際的表格包含數以千計的客戶和日期,可追溯到2015年1月1日。

我一直在線研究一種方法,可以計算每個客戶每項服務的使用量增長率。到目前爲止,我設法做的是:我將這些日期分組爲幾個月。

例如,日期7/14/2016201607(2016年第7個月),並選擇相應月份的最大使用量。因此,現在我需要弄清楚如何計算6月和7月之間的使用差異。

以某種方式減去7月份的使用情況。等等每個月。最終目標是確定使用量增長最大的客戶 - 百分比。我希望能夠查看數據並說公司A在3月份使用了100份許可證,並且在4月份他跳到了1000次。這是1000%增長

對於我說的這個問題的方式,我很抱歉,我對SQL和編碼一般都很陌生,並且我可以提前感謝您提供任何幫助。

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-問題1 on/285557#285557 –

+0

@Nic V.檢查http://stackoverflow.com/questions/33570348/lead-and-lag-functionality-in-sql-server-2008。 – CiucaS

回答

0

如果您正在使用SQL Server 2012(及以上),你可以使用LAG功能:

;WITH cte AS (
SELECT CustomerName, 
     LEFT(REPLACE(CONVERT(nvarchar(10),[Date],120),'-',''),6) as [month], 
     [Service], 
     MAX(UniqueUsersForService) as MaxUniqueUsersForService 
FROM @MyTable 
GROUP BY CustomerName, 
     LEFT(REPLACE(CONVERT(nvarchar(10),[Date],120),'-',''),6), 
     [Service] 
) 

SELECT *, 
     LAG(MaxUniqueUsersForService,1,NULL) OVER (PARTITION BY CustomerName, [Service] ORDER BY [month]) as prevUniqueUsersForService 
FROM cte 
ORDER BY CustomerName, [month], [Service] 

在SQL Server 2008:

;WITH cte AS (
SELECT CustomerName, 
     LEFT(REPLACE(CONVERT(nvarchar(10),[Date],120),'-',''),6) as [month], 
     [Service], 
     MAX(UniqueUsersForService) as MaxUniqueUsersForService 
FROM @MyTable 
GROUP BY CustomerName, 
     LEFT(REPLACE(CONVERT(nvarchar(10),[Date],120),'-',''),6), 
     [Service] 
) 

SELECT c.*, 
     p.MaxUniqueUsersForService as prevUniqueUsersForService 
FROM cte c 
OUTER APPLY (SELECT TOP 1 * FROM cte WHERE CustomerName = c.CustomerName AND [Service] = c.[Service] and [month] < c.[month]) as p 
+0

棒極了。它工作完美。關於這個話題的另一個很快。我有另一個有3列的表:CustomerName,Service,NumberofLincesesPurchased。我怎樣才能加入這些增加的百分比?感謝一家工廠。 –

+0

您可以在CTE中添加上面的查詢,並將其與想要計算百分比的表結合。 – gofr1

0

如果你使用SQL Server 2012或更高版本,試試這個:

SELECT * 
, CASE 
    WHEN uniqueUsersPrevMonth = 0 THEN uniqueUsersInMonth 
    ELSE CAST(uniqueUsersInMonth - uniqueUsersPrevMonth as decimal)/uniqueUsersPrevMonth * 100 
    END AS Increase 
FROM (
    SELECT customer, service, DATEPART(MONTH, [date]) as [month] 
    , SUM(uniqueUsers) AS uniqueUsersInMonth 
    , LAG(SUM(uniqueUsers),1,0) OVER(PARTITION BY customer, service ORDER BY DATEPART(MONTH, [date])) as uniqueUsersPrevMonth 
    FROM @tbl AS t 
    GROUP BY customer, service, DATEPART(MONTH, [date]) 
) AS t1 
ORDER BY customer, service, [month]