SQL中基于双WHERE条件按PCK关联基础PRDS求和问题求助
SQL查询修正方案
问题核心
你当前的SQL同时通过BOPPRDCD和OUTPRDCD做筛选,只能查询单一PCK组合下的单一组件数据,无法满足"汇总基础PRDS在不同PCK组合中数据"的需求;另外分组和排序逻辑也存在不符合SQL规范的问题,导致结果异常。
当前代码的问题点
- WHERE条件限制过死:同时指定
BOPPRDCD和OUTPRDCD,只能返回单个PCK组合下的单个组件数据,无法覆盖多个PCK组合的场景 - GROUP BY不符合规范:仅按
OUTPRDNAME分组,但SELECT中包含多个未聚合的字段(如OUTPRDSRL、BOPPRDCD),在严格SQL模式下会报错,非严格模式下返回结果不可控 - ORDER BY字段缺失:排序用的
PRDSTGDES未在SELECT列表中声明,会引发语法错误
修正后的SQL代码
以下代码针对"汇总基础PRDS在各PCK组合中的数据"需求编写,同时符合SQL规范:
$sql="SELECT bom.BOPPRDCD AS PCK组合, bom.OUTPRDNAME AS 基础PRDS, SUM(bom.REQQTY) AS 总需求量, SUM(bom.TOTALVALUE) AS 总价值, SUM(bom.TOTALVALUE * b_master.calculation)/100 + SUM(bom.TOTALVALUE) AS 最终总价值 FROM bom INNER JOIN b_master ON bom.PRDSTGCD = b_master.PRDSTGCD WHERE bom.OUTPRDCD = '$OUTPRDCD' -- 仅筛选基础PRDS GROUP BY bom.BOPPRDCD, bom.OUTPRDNAME -- 按PCK组合+基础PRDS分组 ORDER BY bom.BOPPRDCD";
额外建议:避免SQL注入风险
直接将变量拼入SQL存在注入风险,建议改用预处理语句(以PDO为例):
$stmt = $pdo->prepare("SELECT bom.BOPPRDCD AS PCK组合, bom.OUTPRDNAME AS 基础PRDS, SUM(bom.REQQTY) AS 总需求量, SUM(bom.TOTALVALUE) AS 总价值, SUM(bom.TOTALVALUE * b_master.calculation)/100 + SUM(bom.TOTALVALUE) AS 最终总价值 FROM bom INNER JOIN b_master ON bom.PRDSTGCD = b_master.PRDSTGCD WHERE bom.OUTPRDCD = ? GROUP BY bom.BOPPRDCD, bom.OUTPRDNAME ORDER BY bom.BOPPRDCD"); $stmt->execute([$OUTPRDCD]); $result = $stmt->fetchAll();
内容的提问来源于stack exchange,提问作者vickeyb4u
相关产品推荐
相关产品推荐

