我有一张桌子:
select personID, categoryCode from entries;
6300936427 083
6314642671 084
6314742066 081
6346724201 083
...
我可以通过以下方式计算每组人数:
select categoryCode, count(e.ID)
from entries e
group by e.categoryCode
order by e.categoryCode;
060 56
062 15
081 377
082 374
我想做同样的计算,但对于一些选择的类别,我想将它们计算在一起。例如,我想如果categoryCode IN('081','082')我想计算它们的结果。我的结果集应该计算为:
select ...
060 56
062 15
080 751 --(377 + 374) counts, that correspond to 081 and 082 categoryGroup
如何使用Oracle分析功能对此进行归档? (Oracle版本10)
答案 0 :(得分:3)
我认为您可以通过扩展现有查询来实现您想要的目标。在我看来,你将categoryCode'081'和'082'映射到'080'的combinedCategoryCode,这是其他两个计数的总和。因此,您可以使用CASE语句执行映射,如下所示。您必须将所需的所有类别代码映射到单独的combineCategoryCodes。 ELSE子句处理您未映射的任何categoryCodes
SELECT CASE t.categoryCode
WHEN '083' THEN '080'
WHEN '084' THEN '080'
ELSE t.categoryCode
END AS combinedCategoryCode,
SUM(t.[count]) AS combinedCount
FROM
(
-- This is your original query
select categoryCode, count(e.ID) as [count]
from entries e
group by e.categoryCode
) t
GROUP BY CASE t.categoryCode
WHEN '083' THEN '080'
WHEN '084' THEN '080'
ELSE t.categoryCode
END
ORDER BY 1;
答案 1 :(得分:1)
史蒂文的查询可以改写:
SELECT
CASE
WHEN t.categoryCode in ('083', '084') THEN '080'
ELSE t.categoryCode
END AS combinedCategoryCode,
count(e.id) AS combinedCount
FROM
entries t
GROUP BY
CASE
WHEN t.categoryCode in ('083', '084') THEN '080'
ELSE t.categoryCode
END
ORDER BY 1;
但是:你可以创建一个配置表,config_categ
categoryCode categ_result
060 060
062 062
081 080
082 080
,查询将是:
SELECT
c.categ_result,
count(e.id) AS combinedCount
FROM
entries t
join config_categ c on (t.categoryCode = c.categoryCode)
GROUP BY
c.categ_result
ORDER BY 1;
PS:您不需要分析功能。这是一个简单的group by
。