mysql - 我有 2 个查询,只有一个区别,我想合并到一个查询中

标签 mysql join group-by

我在 MySQL 中有两个基本相同的查询,它们之间的唯一区别是 min()max() ,我想知道加入两者是否可行。

我相信这两者的结合会再次给我带来显着的脱离和更少的返工。

我的目标是了解第一天和最后一天的“valor_bruto_atual”。

第一次查询:

SELECT 
    titulo_id,
    SUM(valor_bruto_atual) AS valor_max,
    data_imports.data_import AS created_at,
    week(data_imports.data_import) AS weeknumber
FROM
    ativos_extratos
        INNER JOIN
    titulos ON titulo_id = titulos.id
        INNER JOIN
    representantes ON representante_id = representantes.id
        INNER JOIN
    data_imports ON data_import_id = data_imports.id
WHERE
    user_id = 1
        AND ativos_extratos.data_import_id IN (SELECT 
            MAX(ID)
        FROM
            data_imports
        WHERE
            data_import BETWEEN '2018-11-01' AND '2018-12-10'
        GROUP BY week(data_import))
        AND data_imports.data_import BETWEEN '2018-11-01' AND '2018-12-10'
GROUP BY titulos.nome_titulo , weeknumber
ORDER BY data_import ASC , titulos.nome_titulo ASC

第二个查询:

SELECT 
    titulo_id,
    SUM(valor_bruto_atual) AS valor_min,
    data_imports.data_import AS created_at,
    week(data_imports.data_import) AS weeknumber
FROM
    ativos_extratos
        INNER JOIN
    titulos ON titulo_id = titulos.id
        INNER JOIN
    representantes ON representante_id = representantes.id
        INNER JOIN
    data_imports ON data_import_id = data_imports.id
WHERE
    user_id = 1
        AND ativos_extratos.data_import_id IN (SELECT 
            MIN(ID)
        FROM
            data_imports
        WHERE
            data_import BETWEEN '2018-11-01' AND '2018-12-10'
        GROUP BY week(data_import))
        AND data_imports.data_import BETWEEN '2018-11-01' AND '2018-12-10'
GROUP BY titulos.nome_titulo , weeknumber
ORDER BY data_import ASC , titulos.nome_titulo ASC

唯一的变化是列的奇特名称和 min()max()在 where 条件内运行。

最佳答案

解决方案:

SELECT 
    titulo_id as titulo_id,
-- calculate both SUMs, select values for each dependent by what value it matches to
    SUM(CASE WHEN ativos_extratos.data_import_id = borders.min_id THEN valor_bruto_atual END) AS valor_init,
    SUM(CASE WHEN ativos_extratos.data_import_id = borders.max_id THEN valor_bruto_atual END) AS valor_end,    
    data_imports.data_import AS created_at,
    month(data_imports.data_import) AS weeknumber
FROM
    ativos_extratos
        INNER JOIN
    titulos ON titulo_id = titulos.id
        INNER JOIN
    representantes ON representante_id = representantes.id
        INNER JOIN
    data_imports ON data_import_id = data_imports.id
-- moved subquery and condition by it from WHERE 
    INNER JOIN ( SELECT 
                    MIN(ID) as min_id,
                    MAX(ID) as max_id
                 FROM
                    data_imports
                 WHERE
                    data_import BETWEEN '2018-10-01' AND '2018-12-10'
                 GROUP BY month(data_import)
               ) borders ON ativos_extratos.data_import_id IN (borders.min_id, borders.max_id)
WHERE   
    user_id = 1
-- removed subquery and condition were there
        AND data_imports.data_import BETWEEN '2018-10-01' AND '2018-12-10'
GROUP BY titulos.nome_titulo , weeknumber
ORDER BY data_import ASC , titulos.nome_titulo ASC

引用:https://dba.stackexchange.com/questions/224804/i-have-2-queries-with-only-one-difference-that-i-want-to-merge-in-just-one-query/

关于mysql - 我有 2 个查询,只有一个区别,我想合并到一个查询中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53742731/

相关文章:

php - MySQL 分组连接

php - 运行查询时总是获取 NULL

R data.table 对函数参数执行连接

mysql - 最大日期,在 2 个表 MYSQL 中为每个用户找到余额

mysql - 如何使用管理员标志防止篡改?

mysql - 在 SQL 的一个输出中组合表值

sql - Hive 中聚合 ID-属性-值记录

python pandas groupby 关于分类变量

python - 返回索引在 pandas 中有多于一行的 groupby 结果

mysql - 两个sql查询之间的区别(使用join和不使用join)