SQL - 根据其他列的某些标准查询SUM。

问题描述 投票:0回答:1

我有一个问题,我需要根据不同列的标准对美元进行分类汇总。例如,一个客户有多种分类方式,而在分类中,唯一重要的是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即 "HIT "类别。

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的类别为NONE时,这将不会为客户拿起HIT美元。任何帮助将是非常感激的。

谢谢!我有一个问题,我需要把它建立在CASE中,即:当类别为NONE时,这显然不能为客户A提取HIT美元。

sql sum criteria
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 fiddle: http:/sqlfiddle.com#! 98d403e70


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 Fiddle: http:/sqlfiddle.com#!4403516。

© www.soinside.com 2019 - 2024. All rights reserved.