SQL、值过多、结果合并

Posted

技术标签:

【中文标题】SQL、值过多、结果合并【英文标题】:SQL, Too many values, Result consolidation 【发布时间】:2013-01-28 13:26:10 【问题描述】:

我的 SQL 查询有问题,事实上,当我尝试执行此操作时,我得到了以下响应: 我想做的是计算总和和计数

你能帮帮我吗?非常感谢

ORA-00913: 值太多 00913. 00000 - “值太多” *原因: *行动: Erreur à la ligne 2,科隆 5


select distinct 
(select sum(che1.mon), count(che1.typ)
from awbeprod_fr.CHE_BKFRACOMC che1 
where che.ncp = che1.ncp and che.pie=che1.pie and che.typ in ('T','C')),

(select sum(che1.mon) 
from awbeprod_fr.CHE_BKFRACOMC che1 
where che.ncp = che1.ncp and che.typ = che1.typ and che.typ ='F'),

che.ncp, 
m.cpro, m.age,  m.ribdec,  m.dev,
p.lib, cli.cli, cli.pre, cli.nom, 
adcli.adr1, adcli.adr2, adcli.adr3, adcli.cpos, adcli.ville
from 
awbeprod_fr.CHE_BKFRACOMC che, awbeprod_fr.bkcom m, 
awbeprod_fr.bkprod p, awbeprod_fr.bkcli cli, 
awbeprod_fr.bkadcli adcli
where che.ncp = m.ncp 
and che.cli = m.cli and m.cli = cli.cli
and cli.cli = adcli.cli and m.cpro = p.cpro
and che.ncp = '11000003415'
order by che.ncp

【问题讨论】:

【参考方案1】:

使用 ANSI JOIN 将使您的请求更清晰,使用 GROUP BY 应该可以帮助您“多合一”。

SELECT 
SUM (CASE WHEN che.typ in ('T', 'C') THEN che.mon ELSE 0 END) sumMonTC,
SUM (CASE WHEN che.typ in ('T', 'C') THEN 1       ELSE 0 END) cntMonTC,
SUM (CASE WHEN che.typ ='F'          THEN che.mon ELSE 0 END) sumMonF,
che.ncp, 
m.cpro, m.age,  m.ribdec,  m.dev,
p.lib, cli.cli, cli.pre, cli.nom, 
adcli.adr1, adcli.adr2, adcli.adr3, adcli.cpos, adcli.ville

FROM awbeprod_fr.CHE_BKFRACOMC che
    INNER JOIN awbeprod_fr.bkcom m ON che.ncp = m.ncp AND che.cli = m.cli
    INNER JOIN awbeprod_fr.bkprod p ON m.cpro = p.cpro
    INNER JOIN awbeprod_fr.bkcli cli ON m.cli = cli.cli
    INNER JOIN awbeprod_fr.bkadcli adcli on cli.cli = adcli.cli
WHERE che.ncp = '11000003415'
GROUP BY che.ncp, 
m.cpro, m.age,  m.ribdec,  m.dev,
p.lib, cli.cli, cli.pre, cli.nom, 
adcli.adr1, adcli.adr2, adcli.adr3, adcli.cpos, adcli.ville
ORDER BY che.ncp

【讨论】:

感谢您的回复,但您的查询不正确,因为它没有计算正确的总金额,因为缺少条件:其中 che.ncp = che1.ncp 和 che。 pie=che1.pie 和 che.typ in ('T','C')),实际上我使用子查询来确保我计算所有具有 sape che.ncp 和 che.pie 以及 typ 的数据的总和('T','C') 或您的查询仅考虑 che.typ 条件,因此总和不正确。在这种情况下我们该怎么办? @user2008204 您必须使用“where che.ncp = che1.ncp and che.pie = che1.pie”部分,因为您在同一张表上进行了联接。在我的查询中,我没有使用该表两次(没有 che1),因此不需要进行比较。这并不意味着我的查询给出了完美的结果,可能还有另一个问题,但不是你指出的问题。 感谢您的回复,但我需要比较我的总和和计数计算是否正确。事实上,我需要计算所有具有相同 che.ncp 的数据的总和,这就是我使用该表两次的原因。否则有没有其他方法可以不使用该表两次并获得正确的结果?提前谢谢你 @user2008204 只是相同的 che.ncp,或相同的 che.ncp AND 相同的 che.pie @user2008204 select sum(che.mon), count(che.typ) from awbeprod_fr.CHE_BKFRACOMC che1 where che.ncp = '11000003415' AND che.typ IN ('T','C') GROUP BY che.ncp, che.pie 返回多行?和select sum(che.mon), count(che.typ) from awbeprod_fr.CHE_BKFRACOMC che1 where che.ncp = '11000003415' AND che.typ IN ('T','C') GROUP BY che.ncp ?【参考方案2】:

如果您使用子查询,您必须返回一个值,而不是两个或更多。因此,只需将您的第一个子查询分为两个:

select distinct 
(select sum(che1.mon)
from awbeprod_fr.CHE_BKFRACOMC che1 
where che.ncp = che1.ncp and che.pie=che1.pie and che.typ in ('T','C')),

(select count(che1.typ)
from awbeprod_fr.CHE_BKFRACOMC che1 
where che.ncp = che1.ncp and che.pie=che1.pie and che.typ in ('T','C')),

(select sum(che1.mon) 
from awbeprod_fr.CHE_BKFRACOMC che1 
where che.ncp = che1.ncp and che.typ = che1.typ and che.typ ='F'),

che.ncp, 
m.cpro, m.age,  m.ribdec,  m.dev,
p.lib, cli.cli, cli.pre, cli.nom, 
adcli.adr1, adcli.adr2, adcli.adr3, adcli.cpos, adcli.ville
from 
awbeprod_fr.CHE_BKFRACOMC che, awbeprod_fr.bkcom m, 
awbeprod_fr.bkprod p, awbeprod_fr.bkcli cli, 
awbeprod_fr.bkadcli adcli
where che.ncp = m.ncp 
and che.cli = m.cli and m.cli = cli.cli
and cli.cli = adcli.cli and m.cpro = p.cpro
and che.ncp = '11000003415'
order by che.ncp

【讨论】:

感谢您的回答,但我的问题是,当我使用子查询时,不是返回 1 个结果(行)而是返回 7 行。我的数据库中有大量数据,所以它会返回超过 700 000 个结果... @user2008204 Oracle 在第 2 行向您显示错误,因此它是您的 SUM 和 COUNT 子查询。您不能从子查询中返回两者。从我的回答中尝试一条 SQL 语句。此外,如果您使用 SUM 或 COUNT 您的子查询不能返回多个值(如果您不使用 GROUP BY)。

以上是关于SQL、值过多、结果合并的主要内容,如果未能解决你的问题,请参考以下文章

sql查询 ,多行数据合并成一行,并且显示合并后某一列的值拼接结果

有难度的sql相同列值合并行

mybatis查询结果如何合并为列表

SQL Server 在查询结果增加自定义的三个字段?如何搞?

如何合并 SQL 结果?

mysql 查询结果,先查含有某字段的数据,再查其他字段的数据