SQL - 根据其他列的特定条件查询 SUM
SQL - query to SUM based on certain criteria from other columns
我遇到一个问题,我需要根据不同列的标准对美元进行本质上的总和。例如,可以通过多种方式对客户进行分类,而在类别中,唯一重要的是 HIT。如果客户端至少有一行包含 HIT,则即使该特定行不是(示例(第 9 行))也应始终将其归类为 HIT。正如您在我的数据集中看到的那样,客户端 A 的行都是 HIT和 NONE 但由于客户 A 至少有一条线路是 HIT,因此所有美元都应归类为 HITS 美元。由于 none 的其他客户具有 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。任何帮助将不胜感激。
谢谢!
您需要更多信息。我建议 window 函数:
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/#!4/40351/6
您可以将 table 与列出命中客户的子查询结合起来:
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/#!9/8d403e/7/0
我遇到一个问题,我需要根据不同列的标准对美元进行本质上的总和。例如,可以通过多种方式对客户进行分类,而在类别中,唯一重要的是 HIT。如果客户端至少有一行包含 HIT,则即使该特定行不是(示例(第 9 行))也应始终将其归类为 HIT。正如您在我的数据集中看到的那样,客户端 A 的行都是 HIT和 NONE 但由于客户 A 至少有一条线路是 HIT,因此所有美元都应归类为 HITS 美元。由于 none 的其他客户具有 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。任何帮助将不胜感激。
谢谢!
您需要更多信息。我建议 window 函数:
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/#!4/40351/6
您可以将 table 与列出命中客户的子查询结合起来:
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/#!9/8d403e/7/0