如何从Oracle SQL的结果数据聚合?

如何从Oracle SQL的结果数据聚合?,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我有一张桌子: +------+-------+-----------------+ | id | name | code | desc | +------+-------+-----------------+ | 1 | aa | 032016 | grape | | 1 | aa | 012016 | apple | | 1 | aa | 032016 | grape | | 1 | aa | 022016 | orange

我有一张桌子:

+------+-------+-----------------+
| id   | name  | code   | desc   |
+------+-------+-----------------+
| 1    | aa    | 032016 | grape  |
| 1    | aa    | 012016 | apple  |
| 1    | aa    | 032016 | grape  |
| 1    | aa    | 022016 | orange |
| 1    | aa    | 012016 | apple  |
| 1    | aa    | 032016 | grape  |
+------+-------+-----------------+
我尝试了查询:

SELECT id, name, code, desc, COUNT(code) as view
FROM mytable
GROUP BY id, name, code, desc
结果是:

+------+-------+------------------------+
| id   | name  | code   | desc   | view |
+------+-------+------------------------+
| 1    | aa    | 012016 | apple  | 2    |
| 1    | aa    | 022016 | orange | 1    |
| 1    | aa    | 032016 | grape  | 3    |
+------+-------+------------------------+
我所期望的是这样的:

+------+-------+----------------------------------------------------+
| id   | name  | code                 | desc               | view   |
+------+-------+----------------------------------------------------+
| 1    | aa    | 012016,022016,032016 | apple,orange,grape | 2,1,3  |
+------+-------+----------------------------------------------------+
谁能帮我把结果汇总一下吗?
提前谢谢

你的桌子设计让我有点担心。一种水果在桌上总是有相同的代码,这是巧合吗?那为什么要冗余存储呢?应该有一个水果桌,每个水果和它的代码只放一次。你知道为什么这叫做关系数据库系统,是吗

然而,通过您的查询,您几乎达到了您想要的目的。您拥有每个id、名称、代码和描述的计数。现在您希望进一步聚合。所以在下一步中,按id和名称分组,因为您希望每个id和名称有一个结果行。使用
LISTAGG
连接组中的字符串:

SELECT 
  id, 
  name, 
  listagg(code, ',') within group(order by code) as codes,
  listagg(desc, ',') within group(order by code) as descs,
  listagg(view, ',') within group(order by code) as views
FROM
(
  SELECT id, name, code, desc, COUNT(*) as view
  FROM mytable
  GROUP BY id, name, code, desc
)
GROUP BY id, name
ORDER BY id, name;

你的桌子设计让我有点担心。一种水果在桌上总是有相同的代码,这是巧合吗?那为什么要冗余存储呢?应该有一个水果桌,每个水果和它的代码只放一次。你知道为什么这叫做关系数据库系统,是吗

然而,通过您的查询,您几乎达到了您想要的目的。您拥有每个id、名称、代码和描述的计数。现在您希望进一步聚合。所以在下一步中,按id和名称分组,因为您希望每个id和名称有一个结果行。使用
LISTAGG
连接组中的字符串:

SELECT 
  id, 
  name, 
  listagg(code, ',') within group(order by code) as codes,
  listagg(desc, ',') within group(order by code) as descs,
  listagg(view, ',') within group(order by code) as views
FROM
(
  SELECT id, name, code, desc, COUNT(*) as view
  FROM mytable
  GROUP BY id, name, code, desc
)
GROUP BY id, name
ORDER BY id, name;

oracle 11g Forwards SQL server的check Listag函数与oracle不同,请正确使用标记顺便说一句,您不应该将
desc
用作列名,因为它是SQL中的关键字。我想解析器可以处理这个问题,但是不使用它更安全。读者可能会感到困惑,系统也可能会感到困惑(按代码描述、描述、名称描述的顺序)。
视图也是SQL中的一个关键字。这应该不是什么问题,因为据我所知,它只在DDL中使用,而不在DML中使用。为了安全起见,我不会使用它。oracle 11g Forwards SQL server的check Listag函数与oracle不同,请正确使用标记。顺便说一句,您不应该使用
desc
作为列名,因为它是SQL中的关键字。我想解析器可以处理这个问题,但是不使用它更安全。读者可能会感到困惑,系统也可能会感到困惑(按代码描述、描述、名称描述的顺序)。
视图也是SQL中的一个关键字。这应该不是什么问题,因为据我所知,它只在DDL中使用,而不在DML中使用。为了安全起见,我不会使用它。我的真实数据库有点复杂,我曾经考虑过你提到的内容,但谢谢你的建议。再次感谢你的回答,它如预期的那样工作。我的真实数据库有点复杂,我曾经考虑过你提到的内容,但谢谢你的建议。再次感谢你的回答,一切如期。