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;
我有一个名为 "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;