我有一个共同任务,就是将当前季度的业绩与去年同季度的业绩进行比较。我已经编写了这个查询,但只得到了我想要的一半结果。
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。如果有人可以告诉我如何更快地格式化表格,而不是手动在数据点之间输入分隔符,那就太好了。
您的最终查询:
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)