【问题标题】:T-SQL Using CTE to aggregate totals for matching and non-matching periodsT-SQL 使用 CTE 聚合匹配和不匹配期间的总数
【发布时间】:2022-01-09 01:50:27
【问题描述】:

匹配的销售是由连接提供的,我正在寻找无与伦比的销售。

CTE
With PriorSalesCTE
    (
    Item
Variant,
    Sum(sales)
    Date between 7/1/2020 and 7/5/2020
),
    CurrentSalesCTE
(
    Item
Variant,
    Sum(sales)
    Date between 7/1/2021 and 7/5/2021
)
Select 
SUM(cs.Sales) ‘MatchedSales’
FROM PriorSalesCTE ps join CurrentSalesCTE ps
    ON cs.Item = ps.Item
    And cs.Variant = ps.Variant

现在我需要两边的空格 我需要 2020 年售出但 2021 年未售出的商品的销售额 - 销售额损失 相反,2020 年没有销售的 2021 年销售额 - 新销售额

我尝试将这些作为 CTE 的单独部分添加到 CTE 中,但连接并不能满足我的需要。

有什么建议吗? CTE 是否只是阻止我获取所有内容,并可能添加一个 UNION ALL 查询来获取不匹配的值?

【问题讨论】:

  • 您在寻找FULL JOIN 吗? Visual Representation of SQL Joins
  • 您可以使用条件聚合在一次运行中获得两者。你的 DBMS 是什么?
  • 请标记您的特定 RDBMS,您的 CTE 不是我知道的有效语法。
  • 另外,为了检查您是否了解 Stack Overflow 的工作原理,您是否有任何理由不接受您之前问题的任何答案?

标签: sql tsql


【解决方案1】:

对于您的实际查询,您可以使用FULL JOIN,它也会为您提供任何一方的结果。


但我认为还有另一种解决方案:您不需要为此加入单独的查询,只需使用条件聚合即可

WITH SalesByItem AS (
    SELECT
      t.Item,
      t.Variant
      Sales2020 = SUM(CASE WHEN Date BETWEEN '20200701' and '20200705' THEN t.Sales END),
      Sales2021 = SUM(CASE WHEN Date BETWEEN '20210701' and '20210705' THEN t.Sales END)
    FROM YourTable t
    WHERE (Date BETWEEN '20200701' and '20200705'
        OR Date BETWEEN '20210701' and '20210705')
    GROUP BY
      t.Item,
      t.Variant
)
SELECT
  NewSales = SUM(CASE WHEN Sales2020 IS NULL THEN Sales2021 END),
  MatchedSales = SUM(CASE WHEN Sales2020 IS NOT NULL AND Sales2021 IS NOT NULL THEN Sales2021 END),
  LostSales = SUM(CASE WHEN Sales2021 IS NULL THEN Sales2020 END)
FROM SalesByItem s;

【讨论】:

  • 非常感谢,这很好用。
猜你喜欢
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 2020-12-22
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 2011-11-02
相关资源
最近更新 更多