Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多个组和子组进行MySQL求和计算_Mysql - Fatal编程技术网

使用多个组和子组进行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');