本季度与去年同季度比较

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

我有一个共同任务,就是将当前季度的业绩与去年同季度的业绩进行比较。我已经编写了这个查询,但只得到了我想要的一半结果。

WITH orders_cy AS (
    SELECT 
        prod.ProductID,
        prodc.[ProductCategoryID],
        sod.[Year],
        sod.[Quarter],
        sod.OrderQty as qty_cy
    FROM SalesLT.SalesOrderDetail sod
    LEFT JOIN SalesLT.Product prod ON sod.ProductID = prod.ProductID
    LEFT JOIN SalesLT.ProductCategory prodc ON prod.ProductCategoryID = prodc.ProductCategoryID
    WHERE prodc.ProductCategoryID = 5 AND DATEPART(YY,sod.Saledate) = DATEPART(YY,CURRENT_TIMESTAMP)
), 
orders_ly as (
    SELECT 
        prod.ProductID,
        prodc.[ProductCategoryID],
        sod.[Year],
        sod.[Quarter],
        sod.OrderQty as qty_ly
    FROM SalesLT.SalesOrderDetail sod
    LEFT JOIN SalesLT.Product prod ON sod.ProductID = prod.ProductID
    LEFT JOIN SalesLT.ProductCategory prodc ON prod.ProductCategoryID = prodc.ProductCategoryID
    WHERE prodc.ProductCategoryID = 5 AND DATEPART(YY,sod.Saledate) = DATEPART(YY,CURRENT_TIMESTAMP)-1
)

SELECT 
orders_cy.year,
orders_cy.quarter,
sum(orders_cy.qty_cy) as FQSales,
sum(orders_ly.qty_ly) as FQSalesLY,                                                                                             
sum(orders_cy.qty_cy) - sum(orders_ly.qty_ly) as qoq_Diff_Value,
CAST(sum(orders_cy.qty_cy) * 1.0 / sum(orders_ly.qty_ly) -1 AS NUMERIC(18,2)) * 100 AS qoq_DIFF_PERC     
FROM orders_cy
FULL JOIN orders_ly ON 
orders_cy.ProductID = orders_ly.ProductID
AND orders_cy.Quarter = orders_ly.Quarter
GROUP BY orders_cy.ProductCategoryID, orders_cy.[Year], orders_cy.quarter 

第一个 CTE (orders_cy) 返回此数据:

产品ID 产品类别ID 年份 四分之一 销售
779 5 2024 3 3
780 5 2024 1 1
785 5 2024 3 2
780 5 2024 4 3
781 5 2024 4 4
782 5 2024 4 2
783 5 2024 3 5
783 5 2024 4 15
784 5 2024 1 5
981 5 2024 1 1
981 5 2024 2 2
981 5 2024 4 2
985 5 2024 4 2
985 5 2024 2 5
987 5 2024 3 5
988 5 2024 4 11

第二个 CTE (orders_ly) 返回此数据:

产品ID 产品类别ID 年份 四分之一 销售
779 5 2023 1 1
779 5 2023 2 4
779 5 2023 3 3
780 5 2023 2 5
781 5 2023 2 2
782 5 2023 1 3
783 5 2023 3 7
980 5 2023 2 3
981 5 2023 3 2
982 5 2023 1 3
983 5 2023 1 3
984 5 2023 1 1
985 5 2023 3 2
988 5 2023 1 1
988 5 2023 3 2
991 5 2023 3 5
992 5 2023 3 3
993 5 2023 2 1

最终结果应该是:

年份 四分之一 FQ销售 FY销售额 QOQ_DiffValue QOQ_DiffPerc
41
2024 1 7
2024 2 7
2024 3 15 10 5 50.00
2024 4 39

我应该在 FYSalesLY 中看到 12、15、25 和 NULL,上面第一行的 41 应该消失。我认为我遇到的问题是连接。我的表格如下:

SalesLT.SalesOrderDetail(包含销售日期,包括年、季度、月)

SalesLT.Product(包含产品 ID。每个更广泛的类别 ID 有多个产品 ID)

SalesLT.ProductCategory(列出每个产品ID对应的产品类别)

我使用的 CTE 返回相应年份的正确结果。当我尝试从两个 CTE 中进行选择时,问题就出现了。由于某些产品 ID 的销售额在这两年中可能不相同,因此我认为 FULL OUTER JOIN 比较合适,因为我只是想比较年份之间具有相同产品类别的产品的销售额。使用 LEFT 或 RIGHT 外部联接会导致排除某些销售记录。

PS。如果有人可以告诉我如何更快地格式化表格,而不是手动在数据点之间输入分隔符,那就太好了。

sql azure-sql-database
1个回答
0
投票

您的最终查询:

SELECT 
    coalesce(orders_cy.ProductCategoryID, orders_ly.ProductCategoryID) as ProductCategoryId
    coalesce(orders_cy.year,orders_ly.year) as yr,
    coalesce(orders_cy.quarter,orders_ly.quarter) as qtr,
    sum(orders_cy.qty_cy) as FQSales,
    sum(orders_ly.qty_ly) as FQSalesLY,                                                                                             
    coalesce(sum(orders_cy.qty_cy),0) - coalesce(sum(orders_ly.qty_ly),0) as qoq_Diff_Value,
    CAST(sum(orders_cy.qty_cy) * 1.0 / nullif(sum(orders_ly.qty_ly),0) -1 AS NUMERIC(18,2)) * 100 AS qoq_DIFF_PERC     
FROM orders_cy
    FULL JOIN orders_ly ON 
    orders_cy.ProductID = orders_ly.ProductID
    AND orders_cy.Quarter = orders_ly.Quarter
GROUP BY 
    coalesce(orders_cy.ProductCategoryID, orders_ly.orders_cy.ProductCategoryID), 
    coalesce(orders_cy.year,orders_ly.year),
    coalesce(orders_cy.quarter,orders_ly.quarter)
© www.soinside.com 2019 - 2024. All rights reserved.