【问题标题】:How to sum values from different rows in SQL that have the same argument in CASE-WHEN如何对 CASE-WHEN 中具有相同参数的 SQL 中不同行的值求和
【发布时间】:2015-12-22 16:03:55
【问题描述】:

这是我的代码,这是我的问题:

我想将 codCanal 的三个不同值命名为 Rota(02、03 和 05)。但是当我运行这个查询时,我得到了这个值的三个不同的行。比如:

Ano | Mes | Canal | Volume
2015 | 01 | AS | 4423
2015 | 01 | Rota | 552
2015 | 01 | Rota | 744
2015 | 01 | Rota | 1223 
2015 | 01 | HSA | 6510

我只想显示 1 行这些值的总和 (552 + 744 + 1223)。我该如何解决这个问题?

我尝试使用SUM(CASE WHEN),但它返回一个新列,这不是我想要的。

谢谢。

SELECT
    Vendas.datAno AS Ano,
    Vendas.datMes AS Mes,

    CASE WHEN Cliente.codCanal IN ('01') THEN 'AS'
    WHEN Cliente.codCanal IN ('02','03','05') THEN 'Rota'
    WHEN Cliente.codCanal IN ('08') THEN 'HSA'
    END AS Canal,

    ROUND(SUM(Vendas.vlrVolumeLiquido),0) AS Volume

FROM
    tblDadMetaRealCliente Vendas
    INNER JOIN
    tblCadOrganizacaoVenda OV
    ON Vendas.codOrganizacaoVenda = OV.codOrganizacaoVenda
    INNER JOIN
    tblCadCliente Cliente
    ON Vendas.codCliente = Cliente.codCliente
    INNER JOIN
    categoria_simulador_nova Catsim
    ON Vendas.codMaterial = Catsim.codMaterial

WHERE
    Catsim.Catsim IN ('CHESTER LANCHE') AND
    Vendas.datAno IN ('2014', '2015') AND
    Cliente.codCanal IN ('01', '02', '03', '05', '08')

GROUP BY
    Vendas.datAno,
    Vendas.datMes,
    Cliente.codCanal

ORDER BY
    Vendas.datAno,
    Vendas.datMes,
    Cliente.codCanal

【问题讨论】:

  • 你能用 SUM 和 WHERE 代替 CASE - THEN 吗?
  • 不确定我是否明白你的意思。我试图弄清楚,我发现的唯一方法(虽然没有测试)是使用这个查询的结果表并使用这个 SUM 和 WHERE 创建一个新表。这会是最好的解决方案吗?
  • 作为子查询代替字段之一 SELECT SUM(*) WHERE Cliente.codCanal IN('02,'03',05')。

标签: mysql sql sum case-when


【解决方案1】:

您需要在GROUP BY 子句中使用转换后的列名,以便将它们合并为一组。

GROUP BY Vendas.datAno, Vendas.datMes, Canal
ORDER BY Vendas.datAno, Vendas.datMes, Canal

以上是针对 MySQL 的。在 SQL-Server 中,您需要将查询移动到子查询中。

SELECT Ano, Mes, Canal, SUM(Volume) AS Volume
FROM (your query) AS subquery
GROUP BY datAno, datMes, Canal

【讨论】:

  • 实际上,如果我尝试仅使用 Canal,它会返回错误。我用 Cliente.codCanal 代替)。
  • 错误是:Mensagem 207, Nível 16, Estado 1, Linha 32 Invalid column name 'Canal'。 好像他找不到新的列名。也许做一个新的查询会起作用? SELECT Ano, Mes, Canal, SUM(Volume) FROM [result of this query] GROUP BY Ano, Mes, Canal
  • 您确定您使用的是 MySQL 吗?这看起来不像是 MySQL 错误消息。
  • "Invalid column name" 似乎是 SQL-Server 错误,而不是 MySQL。
猜你喜欢
  • 2015-09-12
  • 2022-01-05
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多