СОЮЗ ВСЕ, не объединяющий ряды - PullRequest
1 голос
/ 24 апреля 2020

У меня есть эта таблица, называемая "valores_indices", куда она импортирует значения запасов каждый 1 час, мне нужно получить значения из каждого отслеживаемого запаса в 8:00 и 18:00, соответственно, мои "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')

РЕДАКТИРОВАТЬ

Это то, что я получаю

enter image description here

Это ожидаемый результат

enter image description here

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Мне не очень нравится 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;
0 голосов
/ 24 апреля 2020

Я думаю, что здесь требуется условное агрегирование:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...