如何计算销售增长?

问题描述 投票:0回答:1

我想从三 (3) 个表中获取每月总销售额增长。有人可以告诉我该怎么做吗?

表1

金额
2023 年 9 月 2.00
2023 年 10 月 3.00
2023 年 10 月 1.00

表2

金额
2023 年 9 月 1.00
2023 年 10 月 2.00
2023 年 10 月 2.00

表3

金额
2023 年 9 月 5.00
2023 年 10 月 2.00
2023 年 10 月 1.00

这是我尝试过的

WITH CTE AS (
SELECT OrderDate, Amount FROM Table1 
    UNION ALL 
SELECT OrderDate, Amount FROM Table2 
    UNION ALL SELECT OrderDate, Amount FROM Table3)
SELECT 
    Datepart(Month, OrderDate) as 
    monthly_sales, Sum(Amount) As monthly_sales FROM  CTE Group by Datepart(Month, OrderDate),
CTE2 AS (SELECT *,  lag(monthly_sales) over (order by Month ) as prev_month_sales FROM CTE ), 
CTE3 AS (SELECT     *,  100*(monthly_sales - prev_month_sales)/(prev_month_sales) as sales_growth FROM CTE2)
SELECT * from CTE3

预期输出。

**销售增长**

每月_销售额 上月销售额 销售增长
2023 年 9 月 8.00 0 0
2023 年 10 月 7.00 8.0 12.52
2023 年 10 月 4.00 7.0 -42.86
sql sql-server-2014-express
1个回答
0
投票

我们可以将所有数据包含在 1 个 CTE 中,然后与滞后数据连接。这是我的解决方案:

-- Create the tables
CREATE TABLE Table1 (
    [Month] date,
    Amount decimal(18, 2)
);

CREATE TABLE Table2 (
    [Month] date,
    Amount decimal(18, 2)
);

CREATE TABLE Table3 (
    [Month] date,
    Amount decimal(18, 2)
);

-- Insert data into the tables
INSERT INTO Table1 ([Month], Amount)
VALUES
    ('2023-09-01', 2.00),
    ('2023-10-01', 3.00),
    ('2023-10-01', 1.00);

INSERT INTO Table2 ([Month], Amount)
VALUES
    ('2023-09-01', 1.00),
    ('2023-10-01', 2.00),
    ('2023-10-01', 2.00);

INSERT INTO Table3 ([Month], Amount)
VALUES
    ('2023-09-01', 5.00),
    ('2023-10-01', 2.00),
    ('2023-10-01', 1.00);

-- Calculate sales growth
WITH CombinedData AS (
    SELECT [Month], SUM(Amount) AS monthly_sales
    FROM (
        SELECT [Month], Amount FROM Table1
        UNION ALL
        SELECT [Month], Amount FROM Table2
        UNION ALL
        SELECT [Month], Amount FROM Table3
    ) AS Combined
    GROUP BY [Month]
),
SalesGrowth AS (
    SELECT
        FORMAT([Month], 'MMM yyyy') [Month],
        monthly_sales,
        LAG(monthly_sales, 1, 0) OVER (ORDER BY  [Month]) AS prev_month_sales,
        CASE
            WHEN LAG(monthly_sales, 1, 0) OVER (ORDER BY [Month]) = 0 THEN 0
            ELSE (monthly_sales - LAG(monthly_sales, 1, 0) OVER (ORDER BY  [Month])) * 100.0 / LAG(monthly_sales, 1, 0) OVER (ORDER BY [Month])
        END AS sales_growth
    FROM CombinedData
)
SELECT [Month], monthly_sales, prev_month_sales, sales_growth
FROM SalesGrowth;

DROP TABLE IF EXISTS Table1
DROP TABLE IF EXISTS Table2
DROP TABLE IF EXISTS Table3

这是示例输出:

这里是示例小提琴链接

注意:我根据百分比(乘以 100)创建

sales_growth
。您可以更改以使其适合您的要求

© www.soinside.com 2019 - 2024. All rights reserved.