Oracle仅按一列分组

68de4m5k  于 2022-11-22  发布在  Oracle
关注(0)|答案(5)|浏览(158)

我在Oracle数据库中有一个表,它有40列。我知道如果我想做一个group by查询,select中的所有列都必须在group by中。
我简单地只想做:

select col1, col2, col3, col4, col5 from table group by col3

如果我尝试:

select col1, col2, col3, col4, col5 from table group by col1, col2, col3, col4, col5

它不给予所需的输出。
我已经搜索了这个,但没有找到任何解决方案。所有的查询,我发现使用某种添加()或计数(*)函数。
在Oracle中,是否不能简单地按一列分组?

更新日期:

我很抱歉,我说得不够清楚。
我的表:

+--------+----------+-------------+-------+
| id     | col1     | col2        | col3  |
+--------+----------+-------------+-------+
| 1      | 1        | some text 1 | 100   |
| 2      | 1        | some text 1 | 200   |
| 3      | 2        | some text 1 | 200   |
| 4      | 3        | some text 1 | 78    |
| 5      | 4        | some text 1 | 65    |
| 6      | 5        | some text 1 | 101   |
| 7      | 5        | some text 1 | 200   |
| 8      | 1        | some text 1 | 200   |
| 9      | 6        | some text 1 | 202   |
+--------+----------+-------------+-------+

并执行下列查询:

select col1, col2, col3 from table where col3='200' group by col1;

我将获得以下所需的输出:

+--------+----------+-------------+-------+
| id     | col1     | col2        | col3  |
+--------+----------+-------------+-------+
| 2      | 1        | some text 1 | 200   |
| 3      | 2        | some text 1 | 200   |
| 7      | 5        | some text 1 | 200   |
+--------+----------+-------------+-------+
wqsoz72f

wqsoz72f1#

此处 为 长 注解 ;
是 的 , 你 不能 这么 做 。 想想 看 ... ... 如果 你 有 这样 一 张 table :

Col1 Col2 Col3
A    A    1
B    A    2
C    A    3

中 的 每 一 个
如果 只 按 Col2 进行 分组 , 则 将 分组 为 一 行 ... ... Col1Col3 会 发生 什么 情况 ? 它们 都 有 3 个 不同 的 行 值 。 DBMS 应该 如何 显示 这些 值 ?

Col1 Col2 Col3
A?   A    1?
B?        2?
C?        3?

格式
这 就是 为什么 必须 按 所有 列 分组 , 或者 聚合 或 连接 它们 的 原因 。 ( SUM()MAX()MIN() 等 )
请 向 我们 展示 您 希望 的 结果 , 我们 一定 能 为 您 提供 帮助 。

    • 编辑 - 答案 : * *

首先 , 感谢 您 更新 您 的 问题 。 您 的 查询 没有 id , 但 您 的 预期 结果 有 , 所以 我 将 分别 回答 每个 问题 。

    • 不 带 id * *

您 仍然 需要 按 所有 列 进行 分组 , 以 实现 您 要 实现 的 目标 。 让 我们 一起 来 了解 一下 。
如果 您 在 没有 任何 分组 依据 的 情况 下 运行 查询 :

select col1, col2, col3 from table where col3='200'

格式
你 会 得到 这个 回来 :

+----------+-------------+-------+
| col1     | col2        | col3  |
+----------+-------------+-------+
| 1        | some text 1 | 200   |
| 2        | some text 1 | 200   |
| 5        | some text 1 | 200   |
| 1        | some text 1 | 200   |
+----------+-------------+-------+

格式
所以 现在 你 只 想 看到 col1 = 1 行 一 次 。 但是 要 做到 这 一 点 , 你 需要 把 所有 的 列 都 上 滚 , 这样 你 的 DBMS 就 知道 如何 处理 每 一 列 。 如果 你 试图 只 按 col1 分组 , 你 的 DBMS 会 遇到 一 个 错误 , 因为 你 没有 告诉 它 如何 处理 col2col3 中 的 额外 数据 :

select col1, col2, col3 from table where col3='200' group by col1 --Errors

+----------+-------------+-------+
| col1     | col2        | col3  |
+----------+-------------+-------+
| 1        | some text 1 | 200   |
| 2        | some text 1 | 200   |
| 5        | some text 1 | 200   |
| ?        | some text 1?| 200?  |
+----------+-------------+-------+

格式
如果 按 所有 3 行 分组 , DBMS 知道 将 整个 行 分组 在 一起 ( 这 正是 您 所 希望 的 ) , 并且 只 显示 重复 行 一 次 :

select col1, col2, col3 from table where col3='200' group by col1, col2, col3

+----------+-------------+-------+
| col1     | col2        | col3  |
+----------+-------------+-------+
| 1        | some text 1 | 200   |
| 2        | some text 1 | 200   | --Desired results
| 5        | some text 1 | 200   |
+----------+-------------+-------+

格式

    • 使用 id * *

如果 你 想 看到 id , 你 必须 告诉 你 的 DBMS 要 显示 哪个 id 。 即使 我们 按 所有 列 分组 , 你 也 不会 得到 你 想要 的 结果 , 因为 id 列 会 使 每 一 行 不同 ( 它们 不再 分组 在 一起 ) :

select id, col1, col2, col3 from table where col3='200' group by id, col1, col2, col3

+--------+----------+-------------+-------+
| id     | col1     | col2        | col3  |
+--------+----------+-------------+-------+
| 2      | 1        | some text 1 | 200   | --id = 2
| 3      | 2        | some text 1 | 200   |
| 7      | 5        | some text 1 | 200   |
| 8      | 1        | some text 1 | 200   | --id = 8
+--------+----------+-------------+-------+

格式
因此 , 为了 对 这些 行 进行 分组 , 我们 需要 显 式 地 说明 如何 处理 id 。 根据 所 需 的 结果 , 您 希望 选择 id = 2 , 它 是 * minimum * id , 因此 让 我们 使用 MIN()

select MIN(id), col1, col2, col3 from table where col3='200' group by col1, col2, col3
--Note, MIN() is an aggregate function, so id need not be in the group by

格式
返回 所 需 的 结果 ( 使用 id ) :

+--------+----------+-------------+-------+
| id     | col1     | col2        | col3  |
+--------+----------+-------------+-------+
| 2      | 1        | some text 1 | 200   |
| 3      | 2        | some text 1 | 200   |
| 7      | 5        | some text 1 | 200   |
+--------+----------+-------------+-------+

格式
" 最 后 的 想法 "
这 是 你 的 两 个 麻烦 行 :

+--------+----------+-------------+-------+
| id     | col1     | col2        | col3  |
+--------+----------+-------------+-------+
| 2      | 1        | some text 1 | 200   |
| 8      | 1        | some text 1 | 200   |
+--------+----------+-------------+-------+

格式
每当 您 点击 这些 按钮 时 , 只需 考虑 您 希望 每个 列 做 什么 , 一 次 一 个 。 每当 您 进行 分组 或 聚合 时 , 您 将 需要 处理 * 所有 * 列 。

  • id , 您 只 想 看到 id = 2 , 也 就是 MIN()
  • co1 , 您 只 想 查看 相异 值 , 因此 GROUP BY
  • col2 , 您 只 想 查看 相异 值 , 因此 GROUP BY
  • col3 , 您 只 想 查看 相异 值 , 因此 GROUP BY
kognpnkq

kognpnkq2#

也许你需要的是解析函数
试着这样做:

select col1, col2, col3, col4, col5 
, sum(*) over (partition by col1) as col1_summary
, count(*) over () as total_count
from t1

如果你谷歌这篇文章-你会发现成千上万的例子,例如这个Introduction to Analytic Functions (Part 1)

xzabzqsa

xzabzqsa3#

为什么要使用GROUP BY,而不是ORDER BY?
如果你用英语表述你试图解决的问题(即要求),那么更具体一点会更容易。

sycxhyv7

sycxhyv74#

我猜,也许你需要upivot功能
或发布您想要的特定最终结果

select  col3, col_group 
from table
UNPIVOT ( col_group for value in ( col1,col2,col4,col5))
eit6fx6z

eit6fx6z5#

SELECT * FROM table 
WHERE id IN (SELECT MIN(id) FROM table WHERE col3='200' GROUP BY col1)

相关问题