SQL查询 - 逐年销售增长

ric*_*mer 0 sql-server stored-procedures sql-server-2008

我有一个SQL查询的结果集.通过对每年租户的销售进行分组以获得每年的总销售额来得出这一结果.表名为TENANTSALES,列为:租户,日期,销售等.

TENANT      YEAR    SALES   
tenant 1    2014    2000    
tenant 1    2015    5000       
tenant 2    2013    1000    
tenant 2    2014    1500       
tenant 2    2015    800    
Run Code Online (Sandbox Code Playgroud)

我使用这个SQL查询代码来实现上述结果

select tenant, year(date), SUM(sales)
from tenantSales
group by tenant, YEAR(date)
Run Code Online (Sandbox Code Playgroud)

我需要完成的任务是添加一个列名称年度增长,它将比较和计算每个租户的销售额逐年增长.这是样本正确/期望的输出

TENANT      YEAR    SALES    YEARLY GROWTH
tenant 1    2014    2000    
tenant 1    2015    5000       150%
tenant 2    2013    1000    
tenant 2    2014    1500       50%
tenant 2    2015    800       -46.67%
Run Code Online (Sandbox Code Playgroud)

公式为:((最近一年 - 上一年度)/上一年度)*100

租户1的示例:

((2015年销售额 - 2014年销售额)/ 2014年度销售额)*100 = 150%

香港专业教育学院试图做到这一点,在去年的第二年增加了一年,让我很容易计算两年的销售额,但我不能把最近一年的销售额加起来,只有一年本身.有没有办法或正确的方法呢?

select tenantcode, year(date), SUM(gsc), year(date) + 1
from dailymod
where tenantcode = 'cmbina13'
group by tenantcode, YEAR(date)
Run Code Online (Sandbox Code Playgroud)

您的专业建议将受到高度赞赏.谢谢

Tim*_*sen 6

试试这个查询:

SELECT t1.tenant, t1.YEAR, t1.SALES,
    CASE WHEN t2.YEAR IS NOT NULL THEN
        FORMAT(
            CONVERT(DECIMAL(10, 2), (t1.SALES - t2.SALES)) /
            CONVERT(DECIMAL(10, 2), t2.SALES), 'p')
    ELSE NULL END AS "YEARLY GROWTH"
FROM
(
    SELECT tenant, YEAR(date) AS YEAR, SUM(sales) AS SALES
    FROM tenantSales
    GROUP BY tenant, YEAR(date)
) t1
LEFT JOIN
(
    SELECT tenant, YEAR(date) AS YEAR, SUM(sales) AS SALES
    FROM tenantSales
    GROUP BY tenant, YEAR(date)
) t2
ON t1.tenant = t2.tenant AND t2.YEAR = t1.YEAR - 1
Run Code Online (Sandbox Code Playgroud)

点击下面的链接查看工作演示:

SQLFiddle

晚更新:

您也可以使用Common Table Expressions尝试相同的方法.以下是使用此方法的上述查询:

WITH cte AS(SELECT tenant, YEAR(date) AS YEAR, SUM(sales) AS SALES
            FROM tenantSales
            GROUP BY tenant, YEAR(date))
SELECT c1.*, CONVERT(varchar,
                 CONVERT(DECIMAL(10,2),
                     CONVERT(DECIMAL(10, 2), (c1.SALES - c2.SALES)) /
                     CONVERT(DECIMAL(10, 2), c2.SALES))) + '%' AS "YEARLY GROWTH"
FROM cte c1
LEFT JOIN cte c2 ON c1.tenant = c2.tenant AND c2.YEAR = c1.YEAR - 1
Run Code Online (Sandbox Code Playgroud)

这里有另一个小提琴,你可以测试一下:

SQLFiddle