【问题标题】:UNION ALL not combining rowsUNION ALL 不合并行
【发布时间】:2020-08-08 09:18:32
【问题描述】:

我有一个名为“valores_indices”的表,它每 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')

编辑

这就是我得到的

这是预期的结果

【问题讨论】:

  • 合并如何?发布样本数据和预期结果。
  • 不能合并不相同的值。
  • @forpas 样本数据和预期结果见编辑
  • @user12975442 不,它们不是,一列是零,而另一列是数字。

标签: sql database postgresql group-by union-all


【解决方案1】:

我不太喜欢 PostGreSql,但在 SQL Server 中你就是这样做的,试一试。

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 作为值,但现在大部分都合并了。我现在必须验证这些值
  • 0 是任务无法从股票中获取数据的时候,笨蛋!非常感谢,我试着做你所做的我只是在我的小组之前没有使用那个温度
【解决方案2】:

我认为您希望在这里进行条件聚合:

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

【讨论】:

  • 这些不在我们的服务器上运行,idk 如果我公司的 postgres 版本太旧或什么:(
  • @user12975442:您遇到错误了吗?请分享整个错误消息(并说明它是来自第一个查询还是第二个查询)。
  • 第一个查询问题是过滤器,当我删除它时,它可以工作但没有给出想要的结果(obv原因哈哈)
  • 第二个我不太确定,因为工作中的软件没有给我太多关于错误的细节,它只是说“选择附近的语法错误”,这是一个非常糟糕的软件他们使用
  • @Nimm:好的,我将第一个查询更新为不使用 FILTER(尽管 Postgres 多年来一直支持这一点)。它应该适合你。
猜你喜欢
  • 1970-01-01
  • 2019-07-28
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 2014-03-22
  • 1970-01-01
  • 2016-06-14
相关资源
最近更新 更多