根据其他列的某些条件求和的查询

utugiqy6  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(366)

我有一个问题,我需要基本上明确的总和美元的基础上的标准,从不同的列。例如,有多种方法可以对客户机进行分类,在这些分类中,唯一重要的是命中。如果一个客户机至少有一行包含hit,那么即使该特定行不包含hit,也应该始终将其分类为hit(例如(第9行)。正如您在我的数据集中所看到的,客户机a的行既有命中的行,也没有命中的行,但是由于客户机a至少有一行命中,所以所有的美元都应该归类为命中美元。由于其他客户都没有涉足这一领域,因此他们所有的资金都不会进入这一领域。

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

我想把这件事写进一个案子里。

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'

显然,当类别为“无”时,这不会为客户a收取命中美元。任何帮助都将不胜感激。
谢谢!

n3h0vuf2

n3h0vuf21#

可以使用列出命中客户端的子查询联接表:

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号

5uzkadbs

5uzkadbs2#

你需要更多的信息。我建议窗口功能:

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

相关问题