是否可以对我的sql SELECT语句的结果进行分组而不创建临时表以对一条语句进行求和和分组? 我有一张表格,保存贷方帐户号和借方帐户号的借方和贷方总额。
并为相反的字段输入零,我在下面的联合选择语句下进行了第一个分组,我需要根据重复的帐户名称对输出求和
我可以很容易地获得相同的结果,还是必须加载它的临时表? 我的选择声明如下
select journal_drname AS ACCNAME, sum(amount) AS DEBT,0 as CREDIT
FROM JOURNAL GROUP BY journal_drname
UNION select journal_crname AS ACCNAME, 0 as DEBT,sum(amount) AS
CREDIT,
FROM JOURNAL GROUP BY journal_crname
返回数据,例如:
ACCNAME DEBIT CREDIT
-------- ------- ------
CASH 0 1,000
CASH 900 0
CASH 300 0
BANK 200 0
BANK 400 0
我可以在上方总结以下几项:
ACCNAME DEBIT CREDIT
-------- ------- ------
CASH 200 0
BANK 600 0
我想将这些结果与上述相同。
我试图避免使用临时表,但是如果这是唯一可行的方法,那么我想了解更多有关以这种方式使用临时表的信息。
我也尝试进行某种形式的联接和联合,但不满足条件,而且我也不知道该怎么做。
除非journal_drname中包含不寻常的字符,否则您的结果没有意义。
改写:每个现金名称和现金的贷方和借项值分别为0怎么办? 您提出的SQL否定了这种可能性。
是的,我有两种情况下的帐户名有时会记入贷方,在这种情况下,我必须将帐户名加载到journal_crname中,如果借记了相同的帐户名,则必须将其加载到journal_crname字段中,因此我在外部帐户名中加载了两列 journal_drname和journal_crname
正如您所说的,查询工作正常,让我们将联合查询称为表格
( ...... ) myTable
然后只需创建一个子查询即可获得最后一步
SELECT ACCNAME,
CASE WHEN SUM(CREDIT - DEBT) < 0 THEN - SUM(CREDIT - DEBT)
ELSE 0
END DEBT,
CASE WHEN SUM(CREDIT - DEBT) > 0 THEN SUM(CREDIT - DEBT)
ELSE 0
END CREDIT
FROM ( ...... ) myTable
GROUP BY ACCNAME
该语句看起来很完美,但仍然给我错误消息,不接受最后一行" GROUP BY ACCNAME",我将继续检查并恢复thxs
是的,现在工作量增加了三倍
您发现错误了吗?
是的,我错过了将内部表别名myTable放的原因,这就是为什么。
如果每个子查询只需要一行,则删除group by:
select 'CASH' as ACCNAME, sum(amount) AS DEBT, 0 as CREDIT
FROM JOURNAL
UNION ALL
select 'BANK' as ACCNAME, 0 as DEBT, sum(amount) AS CREDIT
FROM JOURNAL;
(注意:ACCNAME值可能相反。)
要点:对于这种类型的查询,应该使用UNION ALL而不是UNION。 除非您打算删除重复项,否则没有理由承担删除重复项的开销。
另外,除非accname字段中有不寻常的字符,否则您的原始查询应该已经起作用。
我喜欢它...但是我对",除非您打算删除重复项"感到困惑,根据定义,不能有重复项。 基于SQL。 CASH和BANK否定联合中的重复项,并且在内部,由于每行只有一行,因此不能有重复项。 也许您需要在联合的每个部分中的journal_drname的where子句,对于银行的一个子句,对于现金的子句。
@xQbert。。。 即使没有重复项,UNION总是会产生删除重复项的开销(我说"总是";但是我想某个地方的某些数据库可能会识别出某些短路重复项消除的特殊情况)。
关于什么:
select ACCNAME,
CASE WHEN sum(DEBT)>sum(CREDIT) THEN sum(DEBT)-sum(CREDIT) ELSE 0 AS DEBT,
CASE WHEN sum(DEBT)
FROM (
select journal_drname AS ACCNAME,
sum(amount) AS DEBT,
0 as CREDIT
FROM JOURNAL GROUP BY journal_drname
UNION
select journal_crname AS ACCNAME,
0 as DEBT,
sum(amount) AS CREDIT,
FROM JOURNAL GROUP BY journal_crname
) group by ACCNAME
我相信mySql子查询必须具有别名才能工作。