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 @user2008204select 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查询 ,多行数据合并成一行,并且显示合并后某一列的值拼接结果