SQL-根据其他列中的特定条件查询SUM

时间:2020-06-11 18:13:03

标签: sql sum criteria

我遇到一个问题,我需要根据不同列中的条件对美元进行分类汇总。例如,可以通过多种方式对客户进行分类,并且在类别中,唯一重要的是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。任何帮助将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:1)

您需要更多信息。我建议使用窗口功能:

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

答案 1 :(得分: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