UNION ALL 不合并行

UNION ALL not combining rows

我有一个名为 "valores_indices" 的 table,它每 1 小时导入一次股票价值,我需要在上午 8 点和下午 6 点从每只受监控的股票中获取价值,它们分别是我的 "vlrAberto" 和 "vlrFechado" 选择 我不明白为什么这些没有合并,我以前做过,任何帮助将不胜感激,因为我 运行 没有想法,我试图嵌套它但没有任何运气

SELECT
    i.descricao as cotacao,
    m.quantidade as qtdComprada,
    m.valor as vlrUnitario,
    (m.valor * m.quantidade) as valorCompra,
    v.valor as vlrAberto,
    0 as vlrFechado,
    v.data as data
FROM
    movimento_indices m
    LEFT JOIN indices i ON i.idindice = m.idindice
    LEFT JOIN valores_indices v ON v.idindice = m.idindice
WHERE
    v.hora IN ('08:00')
UNION ALL
SELECT
    i.descricao as cotacao,
    m.quantidade as qtdComprada,
    m.valor as vlrUnitario,
    (m.valor * m.quantidade) as valorCompra,
    0 as vlrAberto,
    v.valor as vlrFechado,
    v.data as data
FROM
    movimento_indices m
    LEFT JOIN indices i ON i.idindice = m.idindice
    LEFT JOIN valores_indices v ON v.idindice = m.idindice
WHERE
    v.hora IN ('18:00')

编辑

这就是我得到的

这是预期的结果

我认为您需要此处的条件聚合:

SELECT
    i.descricao as cotacao,
    m.quantidade as qtdComprada,
    m.valor as vlrUnitario,
    (m.valor * m.quantidade) as valorCompra,
    MAX(CASE WHEN v.hora = '08:00' THEN v.valor END) as vlrAberto,
    MAX(CASE WHEN v.hora = '18:00' THEN v.valor END) as vlrFechado,
    v.data as data
FROM
    movimento_indices m
    LEFT JOIN indices i ON i.idindice = m.idindice
    LEFT JOIN valores_indices v ON v.idindice = m.idindice
WHERE v.hora IN ('08:00', '18:00')
GROUP BY 
    i.descricao,
    m.quantidade,
    m.valor,
    m.quantidade,
    v.data

另一种选择是横向连接:

SELECT
    i.descricao as cotacao,
    m.quantidade as qtdComprada,
    m.valor as vlrUnitario,
    (m.valor * m.quantidade) as valorCompra,
    v.vlrAberto,
    v.vlrFechado,
    v.data as data
FROM
    movimento_indices m
    LEFT JOIN indices i ON i.idindice = m.idindice
    LEFT LATERAL JOIN (
        SELECT 
            MAX(v.valor) FILTER(WHERE v.hora = '08:00') as vlrAberto,
            MAX(v.valor) FILTER(WHERE v.hora = '18:00') as vlrFechado,
            v.data
        FROM valores_indices v
        WHERE v.idindice = m.idindice AND v.hora IN ('08:00', '18:00')
        GROUP BY v.data
    ) v ON 1 = 1

我不太喜欢 PostGreSql,但在 SQL 服务器中,这就是你的做法,试一试。

SELECT cotacao, qtdComprada, vlrUnitario, valorCompra, SUM(vlrAberto) vlrAberto, SUM(vlrFechado) vlrFechado, data FROM (
SELECT
    i.descricao as cotacao,
    m.quantidade as qtdComprada,
    m.valor as vlrUnitario,
    (m.valor * m.quantidade) as valorCompra,
    v.valor as vlrAberto,
    0 as vlrFechado,
    v.data as data
FROM
    movimento_indices m
    LEFT JOIN indices i ON i.idindice = m.idindice
    LEFT JOIN valores_indices v ON v.idindice = m.idindice
WHERE
    v.hora IN ('08:00')
UNION ALL
SELECT
    i.descricao as cotacao,
    m.quantidade as qtdComprada,
    m.valor as vlrUnitario,
    (m.valor * m.quantidade) as valorCompra,
    0 as vlrAberto,
    v.valor as vlrFechado,
    v.data as data
FROM
    movimento_indices m
    LEFT JOIN indices i ON i.idindice = m.idindice
    LEFT JOIN valores_indices v ON v.idindice = m.idindice
WHERE
    v.hora IN ('18:00')) temp GROUP BY cotacao, qtdComprada, vlrUnitario, valorCompra, data;