使用多个组和子组进行MySQL求和计算
我有一个查询,没有输出我想要的结果。我为此发送了几天的邮件,但没有找到解决方案 我的代码使用多个组和子组进行MySQL求和计算,mysql,Mysql,我有一个查询,没有输出我想要的结果。我为此发送了几天的邮件,但没有找到解决方案 我的代码 SELECT *, IFNULL(type, 'N/A') AS groupField, IFNULL(type, 'N/A') AS displayField, `pmonth`, `pyear`, count(prj.code) as projects_num FROM `tblProjecats` `prj` LEFT JOIN ( select cda, pyear, pmonth, s
SELECT *, IFNULL(type, 'N/A') AS groupField, IFNULL(type, 'N/A') AS displayField, `pmonth`, `pyear`, count(prj.code) as projects_num
FROM `tblProjecats` `prj`
LEFT JOIN ( select cda, pyear, pmonth, sum(venituri) venituri, sum(cheltuieli) cheltuieli, sum(if(cont3 between 500 and 550,cheltuieli,0)) cheltuieliD, sum(if(cont3 > 550,cheltuieli,0)) cheltuieliI from buffer_cda group by pyear, pmonth, cda ) cda ON `cda`.`cda`=`prj`.`code`
-- more simple left jons --
WHERE (concat(pyear,lpad(pmonth,2,0)) BETWEEN 201811 AND 201911)
GROUP BY `type`, concat_ws('', `cda`.`pyear`, lpad(cda.pmonth, 2, '0'))
ORDER BY `type` ASC, `pyear` ASC, `pmonth` ASC, `cda` ASC
表TBL项目
code type
66666 N/A
66667 Custom
66668 Simple
66669 Simple
66610 N/A
66611 Custom
66612 N/A
表缓冲区\ cda(与项目类型连接以便于可视化)
预期结果
Type pmonth pyear count_prj cheltuieliD
N/A 12 2018 2 9
N/A 1 2019 1 1
Custom 12 2018 1 20
Custom 1 2019 1 10
Simple 12 2018 1 200
Simple 1 2019 1 100
实际结果
Type pmonth pyear count_prj cheltuieliD
N/A 12 2018 2 7
N/A 1 2019 8 1
Custom 12 2018 1 20
Custom 1 2019 3 10
Simple 12 2018 1 200
Simple 1 2019 1 100
我做了一些错误的分组,但我不知道是什么。在其他情况下,我会使用cheltuieliD=2和cheltuieliD=7生成一个duplocate类型(而不是一个cheltuieliD=9的类型)
下一步是计算每种项目类型、周期组(月/年)的cheltuieliD指标,然后计算总计。通过单个查询可以实现这一点吗?使用cda、pyear、pmonth 如果您只想每月返回项目计数,请删除cda frim groupby子句
如果您能解释您想要执行的逻辑操作,我们可以提供帮助。您的数据似乎不能代表您的问题,但鉴于提供的示例数据,我将这样编写代码
drop table if exists tblprojects,buffer_cda;
create table tblProjects
(code int, type varchar(20));
insert into tblprojects values
(66666 , 'N/A'),
(66667 , 'Custom'),
(66668 , 'Simple'),
(66669 , 'Simple'),
(66610 , 'N/A'),
(66611 , 'Custom'),
(66612 , 'N/A');
create Table buffer_cda
(cda int,pmonth int, pyear int, cheltuieliD int);
insert into buffer_cda values
(66666 , 1 ,2019 , 1),
(66667 , 1 ,2019 , 10),
(66668 , 1 ,2019 , 100),
(66669 , 12 ,2018 , 200),
(66610 , 12 ,2018 , 2),
(66611 , 12 ,2018 , 20),
(66612 , 12 ,2018 , 3),
(66612 , 12 ,2018 , 4);
select type,pmonth,pyear,count(type),sum(cheltuieliD)
from tblprojects tp
join buffer_cda bc on bc.cda = tp.code
group by type,pyear,pmonth;
+--------+--------+-------+-------------+------------------+
| type | pmonth | pyear | count(type) | sum(cheltuieliD) |
+--------+--------+-------+-------------+------------------+
| Custom | 12 | 2018 | 1 | 20 |
| Custom | 1 | 2019 | 1 | 10 |
| N/A | 12 | 2018 | 3 | 9 |
| N/A | 1 | 2019 | 1 | 1 |
| Simple | 12 | 2018 | 1 | 200 |
| Simple | 1 | 2019 | 1 | 100 |
+--------+--------+-------+-------------+------------------+
我找到了正确的方法 谢谢大家的回复 我不得不将加入buffer_cda的项目转换为加入buffer_cda的项目。 更进一步,我必须消除其他连接 吼叫我的答案,为codeigniter写的
$this->db->select("*,IFNULL(".$groupField.", 'N/A') AS groupField, IFNULL(".$displayField.", 'N/A') AS displayField, luna,anul,
count(DISTINCT prj.code) as projects_num,
sum(if(cont3 between 500 and 550,cheltuieli,0)) AS cheltuieliD,
sum(if(cont3 > 550,cheltuieli,0)) cheltuieliI,
sum(if(cont3 between 500 and 550,cheltuieli,0))/count(DISTINCT prj.code) AS cheltuieliDAvg,
sum(if(cont3 > 550,cheltuieli,0))/count(DISTINCT prj.code) cheltuieliIAvg
");
$this->db->from('buffer_cda cda');
$this->db->join('(
select * from tblProjects ) prj', 'cda.cda=prj.code', 'LEFT');
我还按类型分组,pyear,pmonth。我正试图使用您提供的相同数据运行此程序,但这些字段在哪里:
venituri
、cheltuieli
、和cont3
?“将项目类型合并以便于可视化”-没有帮助,您应该只按原样包含示例数据。-我假设buffer_cda不包含名为type的列?
$this->db->select("*,IFNULL(".$groupField.", 'N/A') AS groupField, IFNULL(".$displayField.", 'N/A') AS displayField, luna,anul,
count(DISTINCT prj.code) as projects_num,
sum(if(cont3 between 500 and 550,cheltuieli,0)) AS cheltuieliD,
sum(if(cont3 > 550,cheltuieli,0)) cheltuieliI,
sum(if(cont3 between 500 and 550,cheltuieli,0))/count(DISTINCT prj.code) AS cheltuieliDAvg,
sum(if(cont3 > 550,cheltuieli,0))/count(DISTINCT prj.code) cheltuieliIAvg
");
$this->db->from('buffer_cda cda');
$this->db->join('(
select * from tblProjects ) prj', 'cda.cda=prj.code', 'LEFT');