Sql 使用分析函数在Oracle中分组查询计数
我有一张桌子:Sql 使用分析函数在Oracle中分组查询计数,sql,database,oracle,group-by,Sql,Database,Oracle,Group By,我有一张桌子: 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
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
我想做同样的计算,但对于一些选定的类别,我想将它们一起计算。例如,我希望如果categorycodein('081','082')我希望为它们计算结果。我的结果集应计算为:
select ...
060 56
062 15
080 751 --(377 + 374) counts, that correspond to 081 and 082 categoryGroup
如何使用Oracle分析功能对此进行归档?(Oracle版本10)我认为,只要扩展现有查询,就可以实现您想要的。在我看来,您正在将类别代码“081”和“082”映射到组合的类别代码“080”,这是其他两个计数的总和。因此,您可以使用CASE语句进行如下映射。您必须将所有想要的categoryCodes映射到单个组合categoryCodes。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;
我认为,只要扩展现有查询,就可以实现您想要的。在我看来,您正在将类别代码“081”和“082”映射到组合的类别代码“080”,这是其他两个计数的总和。因此,您可以使用CASE语句进行如下映射。您必须将所有想要的categoryCodes映射到单个组合categoryCodes。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;
Steven的查询可以重写:
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:这不需要解析函数。这是一个简单的
分组依据
Steven的查询可以重写:
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:这不需要解析函数。这是一个简单的
分组方式
谢谢,您的解决方案可行,但是有没有办法使用Oracle分析函数进行相同的计算?谢谢,您的解决方案可行,但是有没有办法使用Oracle分析函数进行相同的计算?