Mysql查询两列组和差

Mysql查询两列组和差,mysql,sql,sqlite,Mysql,Sql,Sqlite,我试图得到GROUPBY子句得到的两列之和的差,我正在使用这个查询 "SELECT " + KEY_NAME + ", SUM(" + KEY_COL1 + ") AS s1, SUM(" + KEY_COL2 + ") AS s2, " + KEY_ID + " FROM " + DATABASE_TABLE + " WHERE " + COUNT + " BETWEEN " + start + " AND " + end

我试图得到GROUPBY子句得到的两列之和的差,我正在使用这个查询

"SELECT " + KEY_NAME + ", SUM("
            + KEY_COL1 + ") AS s1, SUM(" + KEY_COL2 + ") AS s2, "
            + KEY_ID + " FROM " + DATABASE_TABLE + " WHERE " + COUNT
            + " BETWEEN " + start + " AND " + end + " GROUP BY "
            + KEY_NAME + " HAVING (s1 - s2) < 0 ORDER BY " + KEY_NAME
            + " ASC"
我做错了什么

此外,我想要满足上述条件的所有字段的s1-s2之和。我该怎么做

编辑:

上述代码用于此目的。但我要问第二个问题


我要Sums1-sums2。基本上,我想要波西米亚式答案中所有“差异”的总和。

删除所有字符串建筑代码噪声后,错误显而易见:

SELECT
    KEY_NAME,
    SUM(KEY_COL1) AS s1,
    SUM(KEY_COL2) AS s2,
    SUM(KEY_COL1) - SUM(KEY_COL2) as diff, -- ### added this to get diff
    KEY_ID
FROM DATABASE_TABLE
WHERE COUNT BETWEEN start AND end
GROUP BY KEY_NAME, KEY_ID -- ### Added KEY_ID to group by clause
HAVING (s1 - s2) < 0
ORDER BY KEY_NAME ASC
您没有按所有非聚合列进行分组:您必须向group by子句添加KEY_ID

在任何其他数据库上,这都会爆炸,但mysql允许它,但会为group by中列出的每个非聚合列的唯一组合返回一个随机行

我还添加了一列,可以根据需要计算总和的差值。

使用

"SELECT SUM(s2) - SUM(s1) FROM ( " + "SELECT " + KEY_NAME + ", SUM("
            + KEY_COL1 + ") AS s1, SUM(" + KEY_COL2 + ") AS s2, "
            + KEY_ID + " FROM " + DATABASE_TABLE + " WHERE " + COUNT
            + " BETWEEN " + start + " AND " + end + " GROUP BY "
            + KEY_NAME + " HAVING (s1 - s2) < 0 ORDER BY " + KEY_NAME
            + " ASC)"

谢谢大家。

这几乎是不可读的。我们能暂时放弃非mysql代码吗?啊!恐怖!为什么人们不使用预先准备好的语句或类似的结构?嘿,谢谢,但是这个查询起作用了。我犯了一些愚蠢的错误,因为所有的“噪音”。但是你能解释一下在分组方式中使用KEY\u ID的原因吗?因为我认为当我们使用GROUP BY KEY\u NAME时,它会使用相同的KEY\u NAME将所有元素分组,所以使用KEY\u ID不会增加错误吗?
"SELECT SUM(s2) - SUM(s1) FROM ( " + "SELECT " + KEY_NAME + ", SUM("
            + KEY_COL1 + ") AS s1, SUM(" + KEY_COL2 + ") AS s2, "
            + KEY_ID + " FROM " + DATABASE_TABLE + " WHERE " + COUNT
            + " BETWEEN " + start + " AND " + end + " GROUP BY "
            + KEY_NAME + " HAVING (s1 - s2) < 0 ORDER BY " + KEY_NAME
            + " ASC)"