代码之家  ›  专栏  ›  技术社区  ›  Italo Rodrigo

如何使用Select将两行合并在一起?

  •  0
  • Italo Rodrigo  · 技术社区  · 5 年前

    我有选择代码:

    select
        produto_licitacoes.descricao,
        case when produto_unidades.unidade_id = 15 then produto_unidades.saldo else 0 end saldo,
        case when produto_unidades.unidade_id = 15 then produto_unidades.qtd - produto_unidades.saldo else 0 end demanda,
        case when produto_unidades.unidade_id = 3 then produto_unidades.saldo else 0 end caf,
        produto_notas.lote,
        produto_notas.dataValidade,
        'S' as tipo
    from
        produto_unidades
        join produto_notas on produto_notas.id = produto_unidades.produtoNota_id
        join produto_licitacoes on produto_licitacoes.id = produto_notas.produtoLicitacoes_id
        join classe_terapeuticas on classe_terapeuticas.id = produto_licitacoes.classeTerapeutica_id
    where 
        (produto_unidades.unidade_id = 3 or produto_unidades.unidade_id = 15)
        and produto_licitacoes.tipoProdutos_id = 1
        and produto_unidades.saldo > 0
    

    这将返回结果:

    'CIMETIDINA 200MG, COMPRIMIDO', '0', '0', '590', '17F35I', '2019-05-30', 'S'
    'CIMETIDINA 200MG, COMPRIMIDO', '400', '0', '0', '17F051', '2019-05-30', 'S'
    

    第一行是 produto_unidades.unidade_id = 3 其次是 produto_unidades.unidade_id = 15 .

    如何连接这两条线?

    'CIMETIDINA 200MG, COMPRIMIDO', '400', '0', '590', '17F35I', '2019-05-30', 'S'
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   GMB    5 年前

    一种解决方案是将查询转换为聚合查询,并使用条件聚合 MAX 计算变量字段。这需要添加 GROUP BY 列出所有非聚合头字段的子句:

    select
        produto_licitacoes.descricao,
        max(case when produto_unidades.unidade_id = 15 then produto_unidades.saldo else 0 end) saldo,
        max(case when produto_unidades.unidade_id = 15 then produto_unidades.qtd - produto_unidades.saldo else 0 end) demanda,
        max(case when produto_unidades.unidade_id = 3 then produto_unidades.saldo else 0 end caf),
        produto_notas.lote,
        produto_notas.dataValidade,
        'S' as tipo
    from
        produto_unidades
        join produto_notas on produto_notas.id = produto_unidades.produtoNota_id
        join produto_licitacoes on produto_licitacoes.id = produto_notas.produtoLicitacoes_id and and produto_licitacoes.tipoProdutos_id = 1
        join classe_terapeuticas on classe_terapeuticas.id = produto_licitacoes.classeTerapeutica_id
    where 
        produto_unidades.unidade_id in (3, 15)
        and produto_unidades.saldo > 0
    group by 
        produto_licitacoes.descricao,
        produto_notas.lote,
        produto_notas.dataValidade
    

    对原始查询的其他更改:

    • 这个 OR 条件 unidade_id 可以表示为 IN 条件
    • 将一些联接条件从 WHERE 条款到 ON 相关条款 JOIN