【问题标题】:SQL - query to SUM based on certain criteria from other columnsSQL - 根据其他列的某些条件查询 SUM
【发布时间】:2020-06-11 18:13:03
【问题描述】:

我有一个问题,我需要根据不同列的标准对美元进行分类汇总。例如,可以通过多种方式对客户端进行分类,在类别中,唯一重要的是 HIT。如果客户端至少有一行包含 HIT,则即使该特定行不是,也应始终将其归类为 HIT(例如(第 9 行)。正如您在我的数据集中看到的那样,客户端 A 的行都是 HIT和 NONE,但由于客户 A 至少有一条线是 HIT,因此所有美元都应归类为 HITS 美元。由于其他客户都没有 HIT 类别,因此他们的所有美元都将归类为 NOT。

CLIENT  DOLLARS CATEGORY 
A   12434   HIT 
B   212 NONE 
C   21  NONE 
D   1231    NONE
B   784 NONE 
A   43577   HIT 
D   64  NONE 
A   123 NONE 
D   12  NONE 
A   53  NONE
A   10  NONE

我正在尝试将其构建为 CASE。

SELECT CASE
WHEN category = 'HIT' THEN 'HITS'
WHEN category <> 'HIT' THEN 'NOT'
ELSE 'OTHER' END AS 'RESULT'
SUM(dollars) AS Dollars
FROM table 1
GROUP BY 'RESULT'

显然,当类别为 NONE 时,这不会为客户 A 提取 HIT Dollars。任何帮助将不胜感激。

谢谢!

【问题讨论】:

    标签: sql sum criteria


    【解决方案1】:

    您可以使用列出命中客户的子查询来加入您的表:

    select (case when (hits.client is null)
                 then 0
                 else 1
            end) as hit,
           sum(dollars) as Dollars
    from t
    left outer join ( select distinct client
                      from t
                      where category = 'HIT' ) hits
    on t.client = hits.client
    group by hit;
    

    SQL 小提琴:http://sqlfiddle.com/#!9/8d403e/7/0

    【讨论】:

    • 我希望能够轻松集成到 SQL fiddle!
    【解决方案2】:

    您需要更多信息。我会建议窗口函数:

    SELECT (CASE WHEN is_hit = 1 THEN 'HITS'
                 ELSE 'NOT'
            END) as result,
           SUM(dollars) AS Sum_Dollars
    FROM (SELECT dollars, 
                 MAX(CASE WHEN category = 'HIT' THEN 1 ELSE 0 END) OVER (PARTITION BY client) as is_hit
          FROM t
         )
    GROUP BY is_hit
    

    SQL 小提琴:http://sqlfiddle.com/#!4/40351/6

    【讨论】:

    • @boisvert 。 . .你应该测试看看。我通常希望窗口函数更快。
    • 确实,windows 功能是一个更快的选择,比较计划:sqlfiddle.com/#!4/40351/10。让测试运行我在您的答案中发现了一个错字,现已更正。
    猜你喜欢
    • 2015-12-24
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多