【问题标题】:I have 2 queries with only one difference that I want to merge in just one query我有 2 个查询,只有一个差异,我只想在一个查询中合并
【发布时间】:2018-12-12 12:09:35
【问题描述】:

我在 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

唯一的变化是列的花哨名称和 where 条件中的 min()max() 函数。

【问题讨论】:

    标签: mysql join group-by


    【解决方案1】:

    解决方案:

    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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多