我可以将十个类似的SQL查询合并为一个吗?

时间:2014-02-06 09:17:07

标签: mysql sql

这是我的MySQL查询:

SELECT ROUND(SUM(cfv.NUMBERVALUE),0) AS mysum
FROM jissue ji JOIN customfieldvalue cfv ON ji.ID=cfv.ISSUE
WHERE ji.pkey LIKE '%PB-%' 
AND cfv.customfield=11381 AND ji.issuestatus=10127;

有两种可能的cfv.customfield(11381和11382)和五种可能的ji.issuestatus(10127 - > 10131),所以每次运行查询十次更改这两个字段。

是否可以将此压缩为一个将返回所有十个SUM的查询?

编辑:我希望结果也包含空值。目前,只返回8行,因为ji.issuestatus = 10128没有11381和11382的NUMBERVALUE。我希望结果为还包括10128,其值为11381/2的空值。

4 个答案:

答案 0 :(得分:1)

这样的事情:

SELECT cfv.customfield, ji.issuestatus, ROUND(SUM(cfv.NUMBERVALUE),0) AS mysum
FROM jissue ji JOIN customfieldvalue cfv ON ji.ID=cfv.ISSUE
WHERE ji.pkey LIKE '%PB-%' 
AND cfv.customfield IN (11381, 11382) AND ji.issuestatus IN (10127, 10128, ..., 10131)
GROUP BY cfv.customfield, ji.issuestatus

前两列和GROUP BY子句在那里,以便您为十种不同组合中的每一种都有一个总和,否则您将只得到与十种组合中的任何一种相匹配的所有行的总和。 / p>

答案 1 :(得分:1)

Sum是一个聚合函数。它使用分组汇总您定义的组中的值。所以我不太了解MySQL语法,但这是我的第一个猜测。

SELECT ROUND(SUM(cfv.NUMBERVALUE),0) AS mysum,
cfv.customfield,ji.issuestatus
FROM jissue ji JOIN customfieldvalue cfv ON ji.ID=cfv.ISSUE
WHERE ji.pkey LIKE '%PB-%' 
AND cfv.customfield in (11381,11382) AND ji.issuestatus in (10127, ... , 10131)
group by cfv.customfield,ji.issuestatus

答案 2 :(得分:0)

是的,你可以使用我的sql IN功能。

试试这个

SELECT ROUND(SUM(cfv.NUMBERVALUE),0) AS mysum
FROM jissue ji JOIN customfieldvalue cfv ON ji.ID=cfv.ISSUE
WHERE ji.pkey LIKE '%PB-%' 
AND cfv.customfield IN(11381,11381) AND ji.issuestatus IN (10127,10128,10129,10130,10131)    GROUP BY cfv.customfield, ji.issuestatus;

答案 3 :(得分:0)

  1. 正如wumpz和Anthony Grist所说,你使用GROUP BY返回所有2 * 5总和,不包含缺失条目的总和
  2. 要返回缺失条目的总和,请使用LEFT JOIN。 tableexpr1 JOIN tableexpr2 ON ...tableexpr1 LEFT JOIN tableexpr2 ON ...之间的区别是,即使tableexpr2中没有相应的条目,也会输出tableexpr1中的LEFT JOIN条目。

    SELECT ji.issuestatus, cf.ID AS customfield_id, ROUND(SUM(cfv.NUMBERVALUE),0) AS mysum
    FROM
        jissue ji CROSS JOIN customfield cf
        LEFT JOIN customfieldvalue cfv ON cfv.ISSUE=ji.ID AND cfv.customfield=cf.ID
    WHERE
        ji.pkey LIKE '%PB-%'
        AND ji.issuestatus IN (10127,10128,10129,10130,10131)
        AND cf.ID IN IN (11381, 11382)
    GROUP BY ji.issuestatus, cf.ID;